在 Unity 中加载 AssetBundle(AB 包)的原理涉及多个关键步骤,包括 AB 包文件的定位与读取、资源的反序列化以及内存管理等
本地路径:如果 AB 包存储在本地磁盘,开发者需要明确其具体的文件路径。在 Unity 里,可使用Application.dataPath(应用数据路径)、Application.persistentDataPath(可持久化数据路径)等获取本地目录,再结合 AB 包文件名来定位文件。例如,对于存储在持久化数据路径下的 AB 包,可通过以下方式获取完整路径:
csharp
string assetBundlePath = Path.Combine(Application.persistentDataPath, "myAssetBundle");
远程 URL:当 AB 包存放在远程服务器时,需要提供其对应的 URL 地址。借助 Unity 的网络请求功能,可从该 URL 下载 AB 包文件。
两种加载代码如下:
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class Load_AB : MonoBehaviour
{
private void Start()
{
StartCoroutine(LoadWWW());
StartCoroutine(FromWebRequest());
}
private IEnumerator FromWebRequest()
{
string path = @"http://192.168.1.80:8088/unity/model.ab";
UnityWebRequest webRequest = UnityWebRequestAssetBundle.GetAssetBundle(path);
yield return webRequest.SendWebRequest();
AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(webRequest);
//object obj = assetBundle.LoadAsset("Image");
//Instantiate((GameObject)obj, FindObjectOfType<Canvas>().transform);
object[] objects = assetBundle.LoadAllAssets();
foreach (var item in objects)
{
Instantiate((GameObject)item, FindObjectOfType<Canvas>().transform);
}
yield return null;
}
private WWW Loadab;
private IEnumerator LoadWWW()
{
Loadab = new WWW("http://192.168.1.80:8088/unity/model.ab"); // 路径可以根据自己需求来修改
yield return Loadab;
if (Loadab.error != null)
{
Debug.Log(Loadab.error);
}
else
{
object[] objects = Loadab.assetBundle.LoadAllAssets();
foreach (var item in objects)
{
Instantiate((GameObject)item, FindObjectOfType<Canvas>().transform);
}
}
}
}