版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq826364410/article/details/86515767
一、从UnityWebRequest加载AssetBundle
public void LoadResource(string resName, string filePath)
{
StartCoroutine(LoadResourceCorotine(resName, filePath));
}
IEnumerator LoadResourceCorotine(string resName, string filePath)
{
AssetBundle ab = null;
string path = @"http://localhost/AssetBundles/" + filePath;
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(path);
yield return request.SendWebRequest();
if (request.isNetworkError || request.isHttpError)
{
Debug.Log(request.error);
}
else
{
ab = DownloadHandlerAssetBundle.GetContent(request);
//ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
}
if (ab == null)
{
yield break;
}
//同步加载
//GameObject gameObject = ab.LoadAsset<GameObject>(resName);
//异步加载
AssetBundleRequest abRequest = ab.LoadAssetAsync<GameObject>(resName);
yield return abRequest;
GameObject ob = abRequest.asset as GameObject;
Instantiate(ob);
// 卸载所有的资源
ab.Unload(true);
}
二、从内存加载AssetBundle
/// <summary>
/// 从内存直接加载
/// </summary>
private void LoadFromMemory(string resName)
{
AssetBundle ab;
ab = AssetBundle.LoadFromMemory(File.ReadAllBytes(m_ABpath));
GameObject ob = ab.LoadAsset<GameObject>(resName);
Instantiate(ob);
ab.Unload(true);
}
/// <summary>
/// 从内存异步加载
/// </summary>
IEnumerator LoadFromMemoryAsync(string resName)
{
AssetBundle ab;
AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(m_ABpath));
yield return request;
ab = request.assetBundle;
if (ab == null)
{
yield break;
}
AssetBundleRequest abRequest = ab.LoadAssetAsync<GameObject>(resName);
yield return abRequest;
GameObject ob = abRequest.asset as GameObject;
Instantiate(ob);
ab.Unload(true);
}
三、从文件加载AssetBundle
/// <summary>
/// 从文件直接加载
/// </summary>
private void LoadFromFile(string resName)
{
AssetBundle ab;
ab = AssetBundle.LoadFromFile(m_ABpath);
GameObject ob = ab.LoadAsset<GameObject>(resName);
Instantiate(ob);
ab.Unload(true);
}
/// <summary>
/// 从文件异步加载
/// </summary>
IEnumerator LoadFromFileAsync(string resName)
{
AssetBundle ab;
AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(m_ABpath);
yield return request;
ab = request.assetBundle;
if (ab == null)
{
yield break;
}
AssetBundleRequest abRequest = ab.LoadAssetAsync<GameObject>(resName);
yield return abRequest;
GameObject ob = abRequest.asset as GameObject;
Instantiate(ob);
ab.Unload(true);
}
四、从Stream加载AssetBundle
/// <summary>
/// 从Stream直接加载
/// </summary>
private void LoadStream(string resName)
{
AssetBundle ab;
FileStream fs = new FileStream(m_ABpath, FileMode.Open, FileAccess.Read);
ab = AssetBundle.LoadFromStream(fs);
GameObject ob = ab.LoadAsset<GameObject>(resName);
Instantiate(ob);
ab.Unload(true);
//加载AssetBundle时,不要处理Stream对象,它的生命周期应该比AssetBundle周期长,
//可以在调用AssetBundle.Unload()后,处理Stream对象
fs.Close();
}
/// <summary>
/// 从Stream异步加载
/// </summary>
IEnumerator LoadStreamAsync(string resName)
{
AssetBundle ab;
FileStream fs = new FileStream(m_ABpath, FileMode.Open, FileAccess.Read);
AssetBundleCreateRequest request = AssetBundle.LoadFromStreamAsync(fs);
yield return request;
ab = request.assetBundle;
if (ab == null)
{
yield break;
}
AssetBundleRequest abRequest = ab.LoadAssetAsync<GameObject>(resName);
yield return abRequest;
GameObject ob = abRequest.asset as GameObject;
Instantiate(ob);
ab.Unload(true);
//加载AssetBundle时,不要处理Stream对象,它的生命周期应该比AssetBundle周期长,
//可以在调用AssetBundle.Unload()后,处理Stream对象
fs.Close();
}
五、加载Manifest配置
/// <summary>
/// 加载Manifest配置
/// </summary>
private void LoadManifest()
{
AssetBundle ab = AssetBundle.LoadFromFile(m_OutPath + "/AssetBundles/AssetBundles");
AssetBundleManifest manifest = ab.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
//foreach (var item in manifest.GetAllAssetBundles())
//{
// print(item);
//}
foreach (var item in manifest.GetAllDependencies("wall.unity3d"))
{
print(item);
AssetBundle.LoadFromFile(m_OutPath + "/AssetBundles/" + item);
}
}