直接看代码效率还高些,听老师讲太犯困了,没有图示啥的就不停地敲代码
直接看代码效率还高些,听老师讲太犯困了,没有图示啥的就不停地敲代码
加载单个ab包并用字典存储起来。加载时先从字典找,没有的话先从类对象池取,再为类对象初始化。
卸载资源先卸载它的依赖包 再卸载自身包
卸载包先减少计数 若计数小于0 则真正卸载包 并从类对象池回收 从字典删除
双向链表的数据结构实现
分别实现添加一个节点到头部或尾部的方法
实现删除某个节点的方法
实现移动某个节点到头部的方法
感觉成员变量多的不行了
总感觉成员变量重复了很多,哭了
string[] resDependence = AssetDatabase.GetAssetBundleDependencies(abBase.ABName, true);
static void CreateConfig(Dictionary<string, string> validPathABNameDict)
{
AssetBundleConfig config = new AssetBundleConfig();
config.ABList = new List<ABBase>();
foreach (string path in validPathABNameDict.Keys)
{
ABBase abBase = new ABBase();
abBase.Path = path;
abBase.Crc = Crc32.GetCRC32(path);
abBase.ABName = validPathABNameDict[path];
abBase.AssetName = path.Remove(0, path.LastIndexOf("/") + 1);
abBase.ABDependence = new List<string>();
string[] resDependence = AssetDatabase.GetAssetBundleDependencies(abBase.ABName, true);
foreach (string de in resDependence)
{
//Debug.LogFormat($"AB包:{abBase.ABName} ------ 依赖{de}");
abBase.ABDependence.Add(de);
}
config.ABList.Add(abBase);
}
//写入XML
.
.
.
//写入二进制
.
.
.
GameObject obj = Instantiate(assetBundle.LoadAsset<GameObject>("Attack.prefab"));
GameObject obj2 = Instantiate(assetBundle.LoadAsset<GameObject>("Attack"));
后缀可加可不加,主要prefab中p小写
图片加载不出来可以用下面这种形式,就不用在方法里面传参数了;
private void OnLoadSpriteTest1(string path, object obj, object param1 = null, object param2 = null, object param3 = null)
{
if (obj != null)
{
Texture2D texture = obj as Texture2D;
Sprite sprite = Sprite.Create(texture, new Rect(0,0,texture.width,texture.height),new Vector2(1f,1f));
m_MainPanel.Test1.sprite = sprite;
Debug.Log("图片1已加载");
}
}
测试可以加载出来
//t:prefab or t:Prefab 表示type:Prefab----- (t:TextAsset 表示文本类型),返回GUID
string[] allStr = AssetDatabase.FindAssets("t:prefab", abConfig.m_AllPrefabPath.ToArray());
foreach (var str in allStr)
{
Debug.Log(AssetDatabase.GUIDToAssetPath(str)); //通过GUID找到资源的全路径(带后缀)
}
这里应该是有问题的
020-AB包
卸载的时候,是否要把 加载的依赖项 也卸载呢?
CacheResource(path, ref item, crc, obj)
这里的ref 应不应该加? ResourItem类型 本事是引用类型,传的也是引用吧?
查找方法时,默认只能查到public方法。如果想要查找private方法,需要设定BindingFlags.
即:
BindingFlags.Public|BindingFlags.Instance 默认查找public、instance内容
BindingFlags.NonPublic|BindingFlags.Instance 查找nonpublic、instance内容
另外,BindingFlags.Instance和BindingFlags.Static二者必须有一项或者都有。如果你的类是instance,就选instance,反之选static。如果两者都不选,是找不到任何方法的
BindingFlags枚举值:
BindingFlags.IgnoreCase:表示忽略 name 的大小写,不应考虑成员名的大小写
BindingFlags.DeclaredOnly:只应考虑在所提供类型的层次结构级别上声明的成员。不考虑继承成员。
BindingFlags.Instance:只搜索实例成员
BindingFlags.Static:只搜索静态成员
BindingFlags.Public:只搜索公共成员
BindingFlags.NonPublic:只搜索非公共成员
BindingFlags.FlattenHierarchy:应返回层次结构上的公共静态成员和受保护的静态成员。不返回继承类中的私有静态成员。静态成员包括字段、方法、事件和属性。不返回嵌套类型。
BindingFlags.InvokeMethod:表示调用方法,而不调用构造函数或类型初始值设定项。对 SetField 或 SetProperty 无效。
BindingFlags.CreateInstance:表示调用构造函数。忽略 name。对其他调用标志无效。
BindingFlags.GetField:表示获取字段值。
BindingFlags.SetField:表示设置字段值。
BindingFlags.GetProperty:表示获取属性。
BindingFlags.SetProperty:表示设置属性。
编辑器脚本可以引用运行时脚本,但是运行时脚本如果引用编辑器脚本,打包时会报错。
a/c/aa
a/c/aa/a.prefab
编辑器下资源回收需要置空所有引用