AssetBundle资源加载 三

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、场景切换的时候

猜你喜欢

转载自blog.csdn.net/qq_22975451/article/details/118365835