unity之AssetBundle

来源:互联网 发布:分层匹配追踪算法 编辑:程序博客网 时间:2024/05/21 04:22

第一步:创建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




原创粉丝点击