[关闭]
@daaoling 2017-02-17T17:57:22.000000Z 字数 2063 阅读 1378

AssetBundle Unity

Unity4 资源管理总结

打包策略

一般目录的打包情况分为以下三种

/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()
    }
}
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注