3.使用AB包资源文件
3.1 知识点
同步加载AB包和AB包中的资源
AssetBundle.LoadFromFile同步地从指定路径加载AB包,返回加载后的AB包。
//LoadFromFile方法 同步的从指定路径加载AB包 返回加载后的AB包
//由于我们选择了StreamingAssets中多拷贝一份 可以直接从StreamingAssets加载AB包
AssetBundle modelAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
//其他加载AB包的API不太常用 理解即可
//注意: 同一个AB包不能加载两次 否则报错
//The AssetBundle 'model' can't be loaded because another AssetBundle with the same files is already loaded.
//AssetBundle modelAssetBundle2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");//报错
AssetBundle.LoadAsset 同步的从一个已加载的AB包中加载指定资源
//LoadAsset方法 同步的从一个已加载的AB包中加载指定资源
//GameObject cube = modelAssetBundle.LoadAsset("Cube") as GameObject; ;//假如只传名字可能会得到同名不同类型的资源 不建议使用
//GameObject cube = modelAssetBundle.LoadAsset<GameObject>("Cube");//泛型加载 可以使用 但是Lua中不支持
GameObject cube = modelAssetBundle.LoadAsset("Cube", typeof(GameObject)) as GameObject;//传入资源的Type 要as成实际类型 Lua中支持
Instantiate(cube);
//同一个AB包可以用于加载多个不同资源
GameObject sphere = modelAssetBundle.LoadAsset<GameObject>("Sphere");
Instantiate(sphere);
异步加载AB包和AB包中的资源
AssetBundle.LoadFromFileAsync 异步地从指定路径加载AB包,返回异步加载AB包的类
AssetBundle.LoadAssetAsync 异步地从一个已加载的AB包中加载指定资源
IEnumerator LoadAssetBundleAsync<T>(string AssetBundleName, string resourceName, Type resourceType)
{
//LoadFromFileAsync方法 异步的从指定路径加载AB包 返回异步加载AB包的类
AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + AssetBundleName);
yield return assetBundleCreateRequest;
//LoadAssetAsync方法 异步的从一个已加载的AB包中加载指定资源
//和同步加载类似 异步加载也有三个重载
//异步加载AB包的类中的assetBundle属性代表已加载的AB包 返回异步加载AB包中的资源的类
//AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync(resourceName);//假如只传名字可能会得到同名不同类型的资源 不建议使用
AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync(resourceName, resourceType);//传入资源的Type
//AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync<T>(resourceName);//泛型加载 可以使用 但是Lua中不支持
yield return assetBundleRequest;
//异步加载AB包中的资源的类中的asset属性代表实际加载出的资源 要as成实际类型
image.sprite = assetBundleRequest.asset as Sprite;
}
使用协程进行异步加载
//开启协程 一定要注意传进来的Type对不对
StartCoroutine(LoadAssetBundleAsync<Sprite>("icon", "quanlity_0",typeof(Sprite)));
卸载AB包和AB包中的资源
AssetBundle.Unload 卸载指定的AB包 传入的参数是是否卸载场景上加载出来的AB包资源
//Unload方法 卸载指定的AB包 传入的参数是是否卸载场景上加载出来的AB包资源
modelAssetBundle.Unload(false);
AssetBundle.UnloadAllAssetBundles 卸载所有已加载的AB包 传入的参数是是否卸载场景上加载出来的AB包资源。
//UnloadAllAssetBundles方法 卸载所有已加载的AB包 传入的参数是是否卸载场景上加载出来的AB包资源
AssetBundle.UnloadAllAssetBundles(false);
3.2 知识点代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Lesson03_使用AB包资源文件 : MonoBehaviour
{
public Image image;
void Start()
{
#region 知识点一 同步加载AB包和AB包中的资源
//LoadFromFile方法 同步的从指定路径加载AB包 返回加载后的AB包
//由于我们选择了StreamingAssets中多拷贝一份 可以直接从StreamingAssets加载AB包
AssetBundle modelAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
//其他加载AB包的API不太常用 理解即可
//注意: 同一个AB包不能加载两次 否则报错
//The AssetBundle 'model' can't be loaded because another AssetBundle with the same files is already loaded.
//AssetBundle modelAssetBundle2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");//报错
//LoadAsset方法 同步的从一个已加载的AB包中加载指定资源
//GameObject cube = modelAssetBundle.LoadAsset("Cube") as GameObject; ;//假如只传名字可能会得到同名不同类型的资源 不建议使用
//GameObject cube = modelAssetBundle.LoadAsset<GameObject>("Cube");//泛型加载 可以使用 但是Lua中不支持
GameObject cube = modelAssetBundle.LoadAsset("Cube", typeof(GameObject)) as GameObject;//传入资源的Type 要as成实际类型 Lua中支持
Instantiate(cube);
//同一个AB包可以用于加载多个不同资源
GameObject sphere = modelAssetBundle.LoadAsset<GameObject>("Sphere");
Instantiate(sphere);
#endregion
#region 知识点二 异步加载AB包和AB包中的资源
//开启协程 一定要注意传进来的Type对不对
StartCoroutine(LoadAssetBundleAsync<Sprite>("icon", "quanlity_0",typeof(Sprite)));
#endregion
#region 知识点三 卸载AB包和AB包中的资源
//Unload方法 卸载指定的AB包 传入的参数是是否卸载场景上加载出来的AB包资源
modelAssetBundle.Unload(false);
//UnloadAllAssetBundles方法 卸载所有已加载的AB包 传入的参数是是否卸载场景上加载出来的AB包资源
AssetBundle.UnloadAllAssetBundles(false);
#endregion
}
#region 知识点二 异步加载AB包和AB包中的资源
IEnumerator LoadAssetBundleAsync<T>(string AssetBundleName, string resourceName, Type resourceType)
{
//LoadFromFileAsync方法 异步的从指定路径加载AB包 返回异步加载AB包的类
AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + AssetBundleName);
yield return assetBundleCreateRequest;
//LoadAssetAsync方法 异步的从一个已加载的AB包中加载指定资源
//和同步加载类似 异步加载也有三个重载
//异步加载AB包的类中的assetBundle属性代表已加载的AB包 返回异步加载AB包中的资源的类
//AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync(resourceName);//假如只传名字可能会得到同名不同类型的资源 不建议使用
AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync(resourceName, resourceType);//传入资源的Type
//AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync<T>(resourceName);//泛型加载 可以使用 但是Lua中不支持
yield return assetBundleRequest;
//异步加载AB包中的资源的类中的asset属性代表实际加载出的资源 要as成实际类型
image.sprite = assetBundleRequest.asset as Sprite;
}
#endregion
#region 知识点三 卸载AB包和AB包中的资源
private void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
//UnloadAllAssetBundles方法 卸载所有已加载的AB包 传入的参数是是否卸载场景上加载出来的AB包资源
AssetBundle.UnloadAllAssetBundles(true);
}
}
#endregion
}
3.3 练习题
如何解决AB包不允许重复加载的问题?
用字典记录已加载的AB包,如果存在则不重复加载。如果要记录,那么一定要提供卸载的方法。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com