@daaoling
2017-02-17T17:57:22.000000Z
字数 2063
阅读 1378
AssetBundle
Unity
一般目录的打包情况分为以下三种
/single_asset_to_single_ab : collect dependence
/multiply_assets_to_single_ab : collect dependence
/single_asset_single_ab : then collect dependence (依赖打包)
如果是前两种情况
如果是后一种
BuildPipeline.BuildAssetBundleExplicitAssetNames
BuildAssetBundleOptions.CollectDependencies no use
你自己根据依赖链打包
BuildPipeline.BuildAssetBundle
BuildAssetBundleOptions.CollectDependencies 这个选项一定要加用来收集依赖
一般应用场景在比如icon,table 全打在一个包里面
load cfg_skill => 专门的table.bytes => load cfg_skill,typeof(textasset)
BuildPipeline.BuildAssetBundle
BuildAssetBundleOptions.CollectDependencies 这个选项一定要加用来收集依赖
一般应用场景比如英雄模型,贴图,mesh 一个模型一个包
一般是一个预设对应mainAsset打包
like /resource/1.prefab = guid.bytes
guid == AssetDatabase.getAssetGuidFromPath(assetpath)
这里有一个坑,如果你打包/assets/recource/icon/1.png => guid.bytes 指定是sprite 格式
当加载图片的时候需要制定格式 guid.bytes.load(1,typeof(spirte))
因为guid.bytes 包含了texture2d,sprite两种格式
load hero1.prefab => 根据 assets/resource/hero1.prefab 这个路径找到 guid.bytes => load hero1,typeof(gameobject)
一般应用场景比如Ui 不同面板依赖不同图集之类的
收集依赖, 一个资源一个包, 根据依赖链打包
load ui1.prefab => find ui1_atlas.prefab,ui1_atlas.png => find ui1.bytes, ui1_atlas.bytes,ui1_atlas.bytes => first load ui1_atlas.bytes,ui1_atlas.bytes => load ui1.bytes => load ui1,typeof(gameobject)
一般第一种的情况的资源是不怎么需要管理的, 永久进内存即可, 可以考虑游戏一开始,就把ab加载进游戏,ab.load 所有资源并引用,之后ab.unload(true or false)均可
比如table ab就全部释放好了, icon加载后引用只释放ab好了
其他两种情况就需要管理了
尤其是第三种, 在加载的时候注意要先加载进依赖
采用引用计数
如果你的游戏是多关卡的,当然一般是单关卡的,可以在关卡切换的时候ResourceMgr.instance.unloadunuseasset 和 Resource 的资源管理如出一辙
示例
class IEffect
{
ResourceUnit res
GameObject fx
void Load()
{
res = ResourceMgr.Instance.load(path)
res.AddRef()
fx = Instantiate(res.Asset) as GameObject
}
void Release()
{
Destroy(fx)
res.ReduceRef() ///引用计数为0 自动释放
}
}
相关类图设计
class ResourceUnit
{
assetbundle ab; ///ab引用
object asset; ///资源引用
int refcount; ///引用计数
public void AddRef()
{
refcount++;
}
public void ReduceRef()
{
refcount--;
if(refcount == 0) ResourceMgr.instance.Release(this)
}
public void Dispose()
{
asset = null;
ab.unLoad(true)
ab = null;
}
}代表一个资源
class ResourceMgr
{
AssetBundle tableab;
AssetBundle iconab;
Dictionary<guid,ResourceUnit> res
public ResourceUnit load(string path)
public void Release(ResourceUnit res)
{
///如果有依赖 卸载依赖
res.Dispose()
}
}