[MenuItem("AssetsBundle/Load")]
static void LoadAssetbundle()
LoadAssetBundleManifest();
LoadBundle();
//本地AssetBundle存储路劲 自己存哪读哪
private static string m_rootFilePath = Application.dataPath + "/StreamingAssets/";
private static AssetBundleManifest manifest = null;
// 加载Manifest
private static void LoadAssetBundleManifest()
var bundle = AssetBundle.LoadFromFile(System.IO.Path.Combine(m_rootFilePath,"StreamingAssets"));
manifest = bundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
// 压缩包释放掉
bundle.Unload(false);
bundle = null;
//加载AssetBundle前,先加载AssetBundle依赖的AssetBundle
private static void LoadBundle()
string bundleName = "logo";
// GetAllDependencies会返回直接和间接关联的AssetBundle 当前AssetBundle所依赖的所有AssetBundle
// 加载依赖包没有顺序要求,
string[] dependence = manifest.GetAllDependencies(bundleName);
for (int i = 0; i < dependence.Length; ++i )
//这地方同步加载,异步也可以(AssetBundle.LoadFromFileAsync)
AssetBundle.LoadFromFile(System.IO.Path.Combine(m_rootFilePath, dependence[i]));
//加载完所有依赖的AssetBundle,加载本身
var bundle = AssetBundle.LoadFromFile(System.IO.Path.Combine(m_rootFilePath, bundleName));
//这里不需要手动LoadAsset 依赖的AssetBundle中资源
//LoadAsset(logo) 资源的时候自动加载与它关联的Asset
GameObject tempGameObject = bundle.LoadAsset<GameObject>("logo");
GameObject tempGameObject1 = Instantiate(tempGameObject) as GameObject;
//这里不需要手动LoadAsset 依赖的AssetBundle中资源
//LoadAsset(logo) 资源的时候自动加载与它关联的Asset
AssetBundle内存卸载:
var tempAb = AssetBundle.LoadFromFile(Application.streamingAssetsPath +
"/assetbundle.unity3d");
var tempPrefab = tempAb.LoadAsset<GameObject>("GameObject");
var tempGo = Instantiate<GameObject>(prefab);
//tempAb.Unload(false);
tempAb.Unload(true);
tempPrefab,tempGo,tempGo .Net 分配的内存,他们都指向非托管堆中的相应变量,如下图所示:
内存卸载:
方法 | 卸载内存 |
tempAb.Unload(false) | 卸载assetbundle.unity3d |
tempAb.Unload(true) | 卸载assetbundle.unity3d 以及 prefab-mesh等 |
Resources.UnloadAsset(obj) | 传入参数为mesh,material,shader等对象,卸载对应的非托管堆资源对应的内存 |
Resources.UnloadUnusedAssets() | 会先调用一次GC,非托管堆没有托管堆引用变量引用的资源将被释放 |
tempAb,tempPrefab,tempGo 此处为临时变量,下次GC回收内存。
AssetBundle中可以实例化的类型:
Texture | 设置read/write enabled后可以 |
AudioClip | 不可以 |
Scene | 可以 |
TextAsset | 可以,但一般没有必要 |
Material | 可以 |
Shader | 可以 |
Mesh | 可以 |
Animator | 可以 |
Animation | 可以 |
TerrainData | 可以 |
GameObject | 可以,Prefab就是GameObject,一般都是实例化prefab,实例化其他的没有必要。 |
https://blog.csdn.net/swj524152416/article/details/54022282
https://docs.unity3d.com/Manual/UnityWebRequest.html
https://blog.csdn.net/itsxwz/article/details/83378045
https://learn.unity.com/tutorial/assets-resources-and-assetbundles#5c7f8528edbc2a002053b5a8
http://stalhandske.dk/UnityDocs/Manual/AssetBundleCompression.html
https://blog.uwa4d.com/archives/ABTheory.html
https://blog.csdn.net/lodypig/article/details/51879702
https://www.cnblogs.com/wgslucky/p/11523575.html
AssetBundle资源加载一个AssetBundle中包含两部分:数据头和数据段。通过AssetBundle加载游戏资源,分为三步: 加载AssetBundle对象。 通过AssetBundle对象加载需要的资源。 对于非引用类型的资源,还需通过GameObject.Instantiate()创建clone。1.加载AssetBundle对象方式Asset...
Unity资源设置ab格式,编辑器工具栏打包,C#生成ab包的脚本
二、3种ab包加载方式
直接本地加载LoadFromFile。本地异步加载LoadFromFileAsync。
服务器异步加载UnityWebRequest。
三、补充说明及相关报错解决
UnityWebRequest获取不同资源数据使用方法会不同;
重新再次加载ab包,出现报错及其解决方法;
大部分是忘记卸载加载过的ab包,然后又再次加载。
一、认识Assetsbundle
由Unity提供的AssetBundle,最早出现于2017版本。允许您通过Unity的WebRequest类下载资源,并在运行时实例化它们。
二、使用Assetsbundle
2.1 准备资源工作
新建Unity工程项目
工程命名:Assetsbundle(其他均可)
将必要的模型以预制件形式存储于资源文件夹内
选中对应预制件资源(可多选)
Inspector窗口会出现关于预制件资源的可视窗口。在窗口的正下方即为Assetsbundle
直接就开门见山了,Unity提供了很多AB包的加载的接口。
AssetBundle.LoadFromFile :从本地加载 AssetBundle 资源包
AssetBundle.LoadFromFileAsync :异步从本地加载 AssetBundle 资源包
AssetBundle.LoadFromMemory :从缓存中下载
Asset...
先来看看AssetBundle类为我们提供的静态方法。
1.AssetBundle.LoadFromFile:从磁盘上同步加载一个AssetBundle资源。
就是本地加载咯?我们在前面几篇博文中使用的就是这一种加载方式,只要我们指定了正确的路径和文件名,相应的AssetBundle资源包就会被加载到我们的内存中等待使用。
2.Ass...
项目需要用到AssetBundle包加载,根据官方API整理的几种加载方式。
一、使用AssetBundle.LoadFormFile,从本地磁盘上同步加载(这种加载方式是最快的)
private void LoadFormFileExample()
AssetBundle ab = AssetBundle.LoadFromFile(rootPath+"AB路径");
if (ab!=null)
GameO
资源加载接口以及分析
AssetBundle.LoadFromFile (string path, uint crc, ulong offset); 同步方法
AssetBundle.LoadFromFileAsync (string path, uint crc, ulong offset); 异步方法
最快的ab包加载方式,内存占用低,不可自定义硬盘数据格式
优点: 加载效率高,内存占用低,加载时只加载文件头,只有在真正加载对应资源的时候才会加载进内存
缺点: 指定的ab包必须是未经自压缩与加密的
一、第一种加载方式本地相对路径资源加载
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundle/sphere.unity3d"); // 本地加载相对路径加载 加载ab包
GameObject cube = ab.LoadAsset<GameObject>("Sphere"); // 获取AB包
Instantiate(cube);...
AssetBundle 引用计数是指在使用 AssetBundle 打包资源的时候,记录每个 AssetBundle 被使用的次数,以便在使用完后及时释放资源,从而避免内存泄漏。在使用 AssetBundle 加载资源时,会对加载的 AssetBundle 进行引用计数的增加,使用完后再进行引用计数的减少,当引用计数为 0 时,就可以释放该 AssetBundle 的资源。
AssetBundle 的打包和加载一般分为以下几个步骤:
1. 打包资源文件:使用 Unity Editor 自带的 AssetBundle 打包工具,将需要打包的资源文件进行打包,生成 AssetBundle 文件。
2. 加载 AssetBundle 文件:在游戏运行时,使用 Unity 提供的 AssetBundle.LoadFromFile 或 AssetBundle.LoadFromMemory 函数来加载 AssetBundle 文件。
3. 加载资源文件:使用加载的 AssetBundle,使用 AssetBundle.LoadAsset 或 AssetBundle.LoadAssetAsync 函数加载需要使用的资源文件。
4. 使用完成后,释放资源:使用 AssetBundle.Unload(false) 函数来释放 AssetBundle 中的资源,同时进行引用计数的减少。如果不再需要该 AssetBundle 中的任何资源,可以使用 AssetBundle.Unload(true) 函数来彻底释放该 AssetBundle,包括清除 AssetBundle 的缓存。
使用 AssetBundle 打包和加载资源可以有效地减少应用程序的内存占用,提高应用程序的性能。同时,在使用 AssetBundle 的时候,需要注意避免重复加载同一个 AssetBundle,以及及时释放不再使用的 AssetBundle 资源,避免内存泄漏。