u3d学习总结笔记本 AssetBundle

AssetBundle

AssetBundle简称AB包,压缩包包含模型、动画、贴图、预制体、声音可以在游戏运行时被加载

AB包自身保存相互依赖关系

压缩包LZMA和LZ4压缩算法,减少包大小,更快网络传输

AssetBundle打包设置

AssetBundle打包函数

 BuildPipeline.BuildAssetBundles("相对路径",BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64)

//None  构建没有任何特殊选项的资产包:体积最小
//UncompressedAssetBundle  在创建资产包时不要压缩数据:最快最大
//ChunkBasedCompression  基于块的压缩:比较小,比较快

最后参数是打包平台

加载AssetBundle

AssetBundle.LoadFromMemoryAsync(二进制加载)

AssetBundle assetBundle = AssetBundle.LoadFromMemory(new byte[] { });//byte[]加载,tcp传输获取的byte数组等

AssetBundle.LoadFromFile(本地文件加载)

AssetBundle assetBundle = AssetBundle.LoadFromFile("相对路径/包名.后缀");

WWW.LoadFromCacheOrDownload(本地和网络url加载)

WWW www = WWW.LoadFromCacheOrDownload("url", 1);//缓存加载 , version参数是版本号

        if (www.isDone) { Debug.Log("等待www加载完毕"); }

AssetBundle assetBundle = www.assetBundle;//拿到ab包

UnityWebRequest(本地和网络url加载)

UnityWebRequest WebRequest = UnityWebRequest.GetAssetBundle("url");//创建一个UnityWebRequest
UnityWebRequestAsyncOperation operation = WebRequest.SendWebRequest();//开始请求服务器

if (WebRequest.downloadHandler.isDone) { Debug.Log("等待WebRequest加载完毕 :方式1"); }
if (operation.isDone) { Debug.Log("等待WebRequest加载完毕 :方式2"); }

AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(WebRequest);//获取方式1
AssetBundle assetBundle = (WebRequest.downloadHandler as DownloadHandlerAssetBundle).assetBundle;//获取方式2

注:

方法后面加Async则为异步加载。

crc校验码可加载时填入第二参数,所以得单独先拿到校验码。

AssetBundle内容清单提取

AssetBundle assetBundle = AssetBundle.LoadFromFile("AB/AB");//加载总资源包,参数:相对路径/总包名
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//获取清单文件列表

foreach (var name in manifest.GetAllAssetBundles())
{
    Debug.Log(name);//打印包名

    //获取包依赖名称
    string[] Dependencies = manifest.GetAllDependencies(name);
}

AssetBundle内容资源提取

AssetBundle assetBundle = AssetBundle.LoadFromFile("AB/cube.3d");//加载资源包

GameObject cube_P = assetBundle.LoadAsset<GameObject>("cube");//加载资源到内存

GameObject cube = Instantiate(cube_P );//实例化物体

AssetBundle卸载

1.减少内存使用
2.有可能导致丢失

AssetBundle assetBundle =  AssetBundle.LoadFromFile("AB/cube.3d")

assetBundle.Unload(true)//卸载所有资源,即使有资源被使用着
assetBundle.Unload(false)//卸载所有没用被使用的资源

//通过 Resources.UnloadUnusedAssets()卸载剩余资源

AssetBundles浏览工具

下载地址

AssetBundle分组策略总结

逻辑实体分组

  • 一个UI界面或者所有UI界面一个包(这个界面里面的贴图和布局信息一个包)
  • 一个角色或者所有角色一个包(这个角色里面的模型和动画一个包)
  • 所有的场景所共享的部分一个包(包括贴图和模型)
  1. 按照类型分组
    所有声音资源打成一个包,所有shader打成一个包,所有模型打成一个包,所有材质打成一个包
  2. 按照使用分组
    把在某一时间内使用的所有资源打成一个包。可以按照关卡分,一个关卡所需要的所有资源包括角色、贴图、声音等打成一个包。也可以按照场景分,一个场景所需要的资源一个包

注意

  1. 经常更新的资源放在一个单独的包里面,跟不经常更新的包分离
  2. 把需要同时加载的资源放在一个包里面
  3. 可以把其他包共享的资源放在一个单独的包里面
  4. 把一些需要同时加载的小资源打包成一个包
  5. 如果对于一个同一个资源有两个版本,可以考虑通过后缀来区分,例如v1、v2、v3

猜你喜欢

转载自blog.csdn.net/qq_40346899/article/details/109989138