《1》ab的打包5.X以上打包ab已经很方便了,打包方案:贴图,大图单独打包成一个ab,材质单独打,shader单独打,动画文件单独打,预设单独打,一个图集(1024*1024大小)打包成一个ab
《2》ab的加载与管理
1:ResMgr 游戏上层调用
member:
getObj(name,objType,callBack<string,bool,obj>);//获取gameObject objType=池子类型
desObj(obj);//销毁gameObject
2:PoolMgr 管理所有对象池
member:
Dict<string,BasePool> pools;//所有池子
getObj(name,poolType,callBack);//获取gameObject poolType=池子生命周期类型 时间池,管卡池,全局池
desObj(obj);//回收gameObject
3:BasePool 管理所有gameobject 派生modelPool,uipool...
member:
string name;//池子名称
GameObjct tempObj;//模版obj
E_PoolType pType;//池子生命周期类型
List<GameObjct> objLst;//缓存obj
List<callBack> loadHandler;//加载回调
List<string> depends;//依赖关系
getObj(callBack);//没有模版 添加一个LoaderTask,有模版 缓存lst>0 从缓存lst取 lst==0 用模版实例化,加载中有其他地方取obj,添加handler回调
saveObj(poolObj);//回收一个obj 没有挂载PoolObj的不会进入池子 在poolMgr层直接销毁
4:LoaderMgr 负责检测加载队列,进行加载
member:
Dict<string,LoaderTask> tasks;//加载队列
addTask(name,callBack<string,bool,TBundle>);//添加一个加载任务 会获取所有依赖 先添加依赖bundle加载任务(递归把最深的依赖放到队列前面),如果有这个任务 加载LoaderTask.addhandler(callBack)
onTick();//遍历加载队列 上一个加载完毕 加载下一个
5:LoaderTask 负责真实加载
member:
addhandler(callBack<string,bool,TBundle>);//添加一个加载回调
IEnumerator load();//协程加载 如果AssetMgr.isHave()有bundle缓存 直接回调,如果没有则AssetBundle.LoadFromFileAsync做一个异步加载,加载完毕缓存到AssetMgr
6:AssetMgr 管理AB
member:
Dict<string, TBundle> bundlePool;//bundle列表
onTick();//检查ab上次使用时间 过期unload(bool) bool是否用引用计数
isHave();//是否包含
getBundle();//获取bundle
addBundle();//添加bundle
releaseRef();//减少refCount
addRef();//增加refCount
disposeBundle();//释放bundle
7:TBundle 封装一次AB
member:
AssetBundle ab;
RefCount count;
onDispose();
Github:https://github.com/tianjiuwan/ECS_XLua