unity之AssetBundle

第一步:创建AssetBundle包

把预制件设置为AssetBundle格式,然后在Editor文件夹下新建CreatAssetBundles.cs文件。

using UnityEditor;       //1.引入Editor和IO两个命名空间
using System.IO;

public class CreatAssetBundles{
    //2.创建编辑器在Assets选项下建个AssetBundles
    [MenuItem("Assets/Build AssetBundles")]

    static void BuildAllBundles()
    {
        //判断AssetBundles文件夹是否存在,如果不存在,新建AssetBundles文件夹,文件夹在工程根目录下
        string dir = "AssetBundles";
        if (Directory.Exists(dir) == false)
        {
            Directory.CreateDirectory(dir);
        }
        //3.创建AssetBundle文件
        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
        //生成四个文件
    }
}

第二步:加载AssetBundle包,有三种方法,从文件加载,从内存加载,从网络加载WWW加载,UnityWebRequest加载

(1)从本地加载AssetBundle包

新建LoadFromFileExample.cs文件,挂在主相机上。

    void Start()
    {
        //从文件加载
        AssetBundle ab = AssetBundle.LoadFromFile("Assetbundle/cube.unity3d");           //加载assetbundle包  
        GameObject cubeprefab = ab.LoadAsset<GameObject>("cube");                       //加载assetbundle包里包含的预制件  
        Instantiate(cubeprefab);  
    }

(2)从内存加载(引入System.IO命名空间)

    void Start()
    {
        //同步内存加载
        string path = "AssetBundles/cube.unity3d";
        AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
        GameObject cubePrefab = ab.LoadAsset<GameObject>("Cube");
        Instantiate(cubePrefab);
    }

    IEnumerator Start()
    {
        //异步内存加载
        string path = "AssetBundles/cube.unity3d";
        AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
        yield return request;
        AssetBundle ab = request.assetBundle;
        
        GameObject cubePrefab = ab.LoadAsset<GameObject>("Cube");
        Instantiate(cubePrefab);
    }

(3)通过WWW.LoadFromCacheOrDownload加载(即将被弃用)

(4)通过UnityWebRequest加载

首先用netbox1.exe搭建简单的服务器。然后引入UnityEngine.Networking命名空间

    IEnumerator Start()
    {
        //string uri = @"file:///D:\My Projects\SikiAssetBundleParctice\AssetBundles\cube.unity3d";
        string uri = @"http://localhost/AssetBundles/cube.unity3d";

        UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri);
        yield return request.Send();
        AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
        //AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;

        GameObject cubePrefab = ab.LoadAsset<GameObject>("Cube");
        Instantiate(cubePrefab);
    }

ps:保存 requset.downloadHandle.data...

保存文件  File.WriteAllbytes....

       //使用AssetBundle来加载依赖的包
        AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
        AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
        string[] strs = manifest.GetAllDependencies("cube.unity");
        foreach(string name in strs)
        {
            print(name);
            AssetBundle.LoadFromFile("AssetBundles/" + name);
        }

第三步:AssetBundle的卸载
卸载有两个方面
1,减少内存使用
2,有可能导致丢失
所以什么时候去卸载资源
AssetBundle.Unload(true)卸载所有资源,即使有资源被使用着
 (1,在关切切换、场景切换2,资源没被用的时候 调用)
AssetBundle.Unload(false)卸载所有没用被使用的资源
 个别资源怎么卸载1,通过 Resources.UnloadUnusedAssets. 2,场景切换的时候 
ps:AssetBundle浏览工具  

下载地址:https://github.com/Unity-Technologies/AssetBundles-Browser




猜你喜欢

转载自blog.csdn.net/qq_35669619/article/details/77453010