1、 资源加载
AssetBundle的加载有以下几种方式:
1、从本地加载使用LoadFromFile
2、从内存加载使用LoadFromMemoryAsync
3、从服务器Web上加载使用UnityWebRequest
1.1 本地加载 LoadFromFile
using UnityEngine;
using System.Collections;
public class LoadFromFileExample : MonoBehaviour {
IEnumerator Start () {
string path = "AssetBundles/StandaloneWindows/wall/wall00.unity3d";
// LoadFromFile
//异步加载
AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path);
yield return request;
AssetBundle ab = request.assetBundle;
//同步加载
//AssetBundle ab = AssetBundle.LoadFromFile(path);
//获取此AB包里所有资源的名字
foreach (string name in ab.GetAllAssetNames())
{
Debug.Log(name);
}
//使用里面的资源
Object[] obj = ab.LoadAllAssets<GameObject>();//加载出来放入数组中
// 创建出来
foreach (Object o in obj)
{
Instantiate(o);
}
//
}
}
或者直接创建某一个名字的资源
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/StandaloneWindows/wall/wall00.unity3d");
//后面的模型名字是真实的加载后的模型名称,和AB包设置的标签没有关系
GameObject obj = ab.LoadAsset<GameObject>("wall00");
Instantiate(obj);
1.2 从内存加载 LoadFromMemoryAsync
using UnityEngine;
using System.IO;
using System.Collections;
public class LoadFromFileExample : MonoBehaviour {
IEnumerator Start () {
string path = "AssetBundles/StandaloneWindows/wall/wall00.unity3d";
// LoadFromMemoryAsync
//异步加载
AssetBundleCreateRequest request =
AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
yield return request;
AssetBundle ab = request.assetBundle;
//同步方式
//AssetBundle ab= AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
//使用里面的资源
Object[] obj = ab.LoadAllAssets<GameObject>();//加载出来放入数组中
// 创建出来
foreach (Object o in obj)
{
Instantiate(o);
}
}
}
1.3 从服务器Web上加载 UnityWebRequest
服务器加载使用http , 本地加载使用file
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class LoadFromFileExample : MonoBehaviour {
IEnumerator Start () {
//第三种加载方式 使用UnityWbRequest 服务器加载使用http本地加载使用file
//string uri = @"file:///C:\Users\Administrator\Desktop\AssetBundleProject\AssetBundles\model.ab";
string uri = @"http://localhost/AssetBundles/StandaloneWindows/wall/wall00.unity3d";
UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri);
yield return request.Send();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
//使用里面的资源
Object[] obj = ab.LoadAllAssets<GameObject>();//加载出来放入数组中
// 创建出来
foreach (Object o in obj)
{
Instantiate(o);
}
}
}
2、依赖打包
对于依赖的资源包,以模型A 依赖 材质B为例,在加载A之前,需要先把B资源 Load 出来,这样,在加载A的时候会自动去找资源B
using UnityEngine;
public class LoadFromFileExample : MonoBehaviour {
void Start () {
AssetBundle ab = AssetBundle.LoadFromFile("A");
AssetBundle abShare = AssetBundle.LoadFromFile("B");
//GameObject go = ab.LoadAsset<GameObject>("Cube");
//Instantiate(go);
Object[] obj = ab.LoadAllAssets<GameObject>();//加载出来放入数组中
//创建出来
foreach (Object o in obj)
{
Instantiate(o);
}
}
}
3、通过AssetBundleManifest获取所有包
//主manifest文件
AssetBundle manifesAB = AssetBundle.LoadFromFile("AssetBundles/StandaloneWindows/StandaloneWindows");
AssetBundleManifest manifest = manifesAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
foreach (string name in manifest.GetAllAssetBundles())
{
print(name);
}
4、获取某个AB包所依赖的所有包。
首先通过AssetBundleManifest,获取所有包,然后获取指定某个包所依赖的所有包。
扫描二维码关注公众号,回复:
14792285 查看本文章
AssetBundle manifesAB = AssetBundle.LoadFromFile("AssetBundles/StandaloneWindows/StandaloneWindows");
AssetBundleManifest manifest = manifesAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
foreach (string name in manifest.GetAllAssetBundles())
{
//print(name);
}
//获取某个AB包所依赖的所有包的名字
string[] strs = manifest.GetAllDependencies("sphere/q2.qq");
//通过名字,加载所有的被依赖包
foreach (var name in strs)
{
Debug.Log(name); //材质球 //mat/wall02.unity3d
AssetBundle.LoadFromFile("AssetBundles/StandaloneWindows/" + /*"mat/wall02.unity3d"*/ name);
}
5、AssetBundle的卸载
卸载有两个方面
1,减少内存使用
2,有可能导致丢失
所以什么时候去卸载资源
AssetBundle.Unload(true)卸载所有资源,即使有资源被使用着
1、在关卡切换、场景切换的时候
2、资源没被调用的时候
AssetBundle.Unload(false) 卸载所有没有被使用的资源
个别资源怎么卸载
1、通过 Resources.UnloadUnusedAssets.
2、场景切换的时候