AB包异步加载资源
我用的AB包加载的方式是使用AssetBundleCreateRequest类 和 AssetBundleRequest类来进行加载AB包
上述图片中,path为AB包的本地地址
AssetBundle.LoadAssetAsync() 是Unity官方提供的异步加载asset的方法。
但是在实际项目中,各功能是模块化的,如果想将加载AB模块分离出来的话,示例大致如下:
AssetManager.cs中部分代码,如下:
public void LoadResource<GameObject>(string assetBundleName, Action<UnityEngine.GameObject> callback)
{
StartCoroutine(LoadAssetAsync(assetBundleName, callback));
}
private const string AssetBundlePath = "D:/UnityProject/20201018Test/Assets/AssetBundle/";
//迭代器
private IEnumerator LoadAssetAsync(string assetBundleName, Action<GameObject> callback)
{
AssetBundleCreateRequest bundleLoadRequest;
string path = AssetBundlePath + assetBundleName;
bundleLoadRequest = AssetBundle.LoadFromFileAsync(path);
yield return bundleLoadRequest;
var myLoadAssetBundle = bundleLoadRequest.assetBundle;
if (myLoadAssetBundle == null)
{
Debug.Log("无法加载AssetBundle");
yield break;
}
var assetLoadRequest = myLoadAssetBundle.LoadAssetAsync(assetBundleName);
yield return assetLoadRequest;
callback(assetLoadRequest.asset as GameObject);
yield return new WaitForEndOfFrame();
}
其他类调用时代码,如下:
AssetManager assetManager;
// Start is called before the first frame update
void Start()
{
assetManager = GameObject.Find("GameManager").GetComponent<AssetManager>();
StartCoroutine(Load<UnityEngine.Object>("player", go =>
{
Debug.Log("开始运行CallBack");
GameObject.Instantiate(go, transform.parent).name = go.name;
}));
}
public IEnumerator Load<T>(string name, Action<GameObject> callback)
{
assetManager.LoadResource<UnityEngine.Object>(name, callback);
yield return new WaitForEndOfFrame();
}