Asset Bundle的资源加载与使用
资源加载 与 卸载
AB加载方式:
- AssetBundle.LoadFromFile 从本地加载
// 以编辑器为使用案例, AB包的资源拷贝到了 streamingAssetsPath 的目录下, 加载AB包资源操作如下
// 如果是其他平台的,则只需要保证AB包资源的正式路径正确即可
string path = Application.streamingAssetsPath + "/" + "common/main.ab";
AssetBundle ab = AssetBundle.LoadFromFile(path);
- AssetBundle.LoadFromFileAsync 异步加载
void Start()
{
StartCoroutine(LoadABPackRes());
}
IEnumerator LoadABPackRes()
{
// 以编辑器为使用案例,AB包的资源拷贝到了 streamingAssetsPath 的目录下,加载AB包资源操作如下
// 如果是其他平台的,则只需要保证AB包资源的正式路径正确即可
string path = Application.streamingAssetsPath + "/" + "common/main.ab";
AssetBundleCreateRequest abPack = AssetBundle.LoadFromFileAsync(path);
yield return abPack;
// TODD 操作使用已加载的AB包资源 abPack
}
- 注意事项:已经加载过的AB包,不可重复加载,重复加载会报错
Asset Bundle 使用
void Start()
{
// AssetBundle.LoadFromFile加载AB包
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "common/main.ab");
// 使用 LoadAsset 泛型的方法(lua不支持泛型,只能再C#) 获取AB包中的资源
GameObject obj = ab.LoadAsset<GameObject>("Sphere");
// 实例资源
Instantiate(obj);
// 异步加载AB包资源
StartCoroutine(LoadABPackRes());
}
IEnumerator LoadABPackRes()
{
// AssetBundle.LoadFromFileAsync 异步加载AB资源
AssetBundleCreateRequest abLoad = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + "mode/base_mode.ab");
yield return abLoad;
// abLoad.assetBundle.LoadAssetAsync 异步加载资源,使用typeof转换类型, lua常用方式
AssetBundleRequest abRes = abLoad.assetBundle.LoadAssetAsync("Cube", typeof(GameObject));
yield return abRes;
// 实例资源
GameObject obj = abRes.asset as GameObject;
Instantiate(obj);
}
Asset Bundle 卸载
- AssetBundle.Unload 卸载当前包资源
// 以编辑器为使用案例,AB包的资源拷贝到了 streamingAssetsPath 的目录下,加载AB包资源操作如下
//如果是其他平台的,则只需要保证AB包资源的正式路径正确即可
string path = Application.streamingAssetsPath + "/" + "common/main.ab";
AssetBundle abPack = AssetBundle.LoadFromFile(path);
// 卸载当前已经已加载abPack的AB包, 参数true表示卸载AB包时,同时卸载掉所有的资源引用, false则只卸载AB包,不卸载掉当前已经使用的资源
abPack .Unload(true);
- AssetBundle.UnloadAllAssetBundles 卸载所有AB包资源
// 卸载所有已加载的AB包, 参数true表示卸载AB包时,同时卸载掉所有的资源引用, false则只卸载AB包,不卸载掉当前已经使用的资源
AssetBundle.UnloadAllAssetBundles(true);
AB包存在依赖关系的使用
依赖关系:一个AB包(M包)中的资源用到了其他AB包(P包)中的资源,这种就指 A包 依赖了 B包,所以在使用M包中存在依赖P包的资源时,需要同时加载M包、P包两个AssetBundle,不会就会存在资源丢失的问题。ab包依赖关系如图:
依赖包的加载方式
- 使用AssetBundle.LoadFromFile同时加载依赖的AB包
// 以编辑器为使用案例,AB包的资源拷贝到了 streamingAssetsPath 的目录下,加载AB包资源操作如下
// 如果是其他平台的,则只需要保证AB包资源的正式路径正确即可
string path_1 = Application.streamingAssetsPath + "/common/main.ab";
AssetBundle ab_1 = AssetBundle.LoadFromFile(path_1 );
string path_2 = Application.streamingAssetsPath + "/mode/base_mode.ab";
AssetBundle ab_2 = AssetBundle.LoadFromFileAsync(path_2 );
- 使用主包中缓存的依赖关系,同时加载其存在依赖包的其他包
PC 是在AB包打包后,自动会生成所有AB包的相关信息,其中包含就包含有AB包之间的依赖关系
// 以编辑器为使用案例,AB包的资源拷贝到了 streamingAssetsPath 的目录下,加载AB包资源操作如下
// 如果是其他平台的,则只需要保证AB包资源的正式路径正确即可
// PC 是在AB包打包后,自动会生成所有AB包的相关信息,其中包含就包含有AB包之间的依赖关系
string sMainPath = Application.streamingAssetsPath + "/PC";
AssetBundle abMain = AssetBundle.LoadFromFile(sMainPath);
// 获取主文件AB包相关的信息,其类型固定是 AssetBundleManifest
AssetBundleManifest abManifest = abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
// 获取这个 mode/base_mode.ab 的依赖关系
string[] sRelyon = abManifest.GetAllDependencies("mode/base_mode.ab");
for(int i = 0; i < sRelyon.Length; i++)
{
// 输出mode/base_mode.ab的其他依赖包文件名
Debug.Log(sRelyon[i]);
}
输出效果