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