Unity资源管理--AssetBundle学习
Unity資源目錄
當用Unity創建一個工程的時候,目錄如下:
Assets:存放Unity工程實際的資源目錄。
Library:存放Unity處理完畢的資源,由unity自動轉化生成。
Log:存放日志文件。
Packages:統一管理各種packages組件,使用PackageManager進行管理。
ProjectSettings:存放Unity的各種項目設定。
當進行項目遷移時,只需要將Assets、Packages以及ProjectSettings三個目錄拷貝即可。
Unity提供了Resource加載和AssetBundle加載兩種方式
引用這篇文章的內容 Unity資源管理(二)-Resources文件夾
強烈不建議使用Resources系統,原因如下:
使用Resources文件夾將會使細粒度的內存管理變得更難
對Resources文件夾的不恰當使用會導致應用程序構架和啟動時間變長
隨著Resources文件夾數量的增加,在這些文件夾中管理Asset將會變得越來越難
使用Resources系統會降低項目向不同平臺提供定制內容的能立,并且導致項目無法進行增量內容更新
AssetBundle學習
AssetBundle 官方API文檔
AssetBundles的壓縮方式:LZMA、LZ4、不壓縮
1. 加載AssetBundles
AssetBundle.LoadFromMemory(Async optional) // 不推薦,此API會消耗兩倍于AB大小的內存 AssetBundle.LoadFromFile(Async optional) // 推薦使用 UnityWebRequest.GetAssetBundle // 在Unity 5.2及更早版本中使用 WWW.LoadFromCacheOrDownload2. 從AssetBundles中加載Assets
LoadAsset(LoadAssetAsync) // 加載單個或者少量時使用 LoadAllAssets(LoadAllAssetsAsync) // 加載多數或者所有Assets時使用 LoadAssetWithSubAssets(LoadAssetWithSubAssetsAsync)3. 構建AssetBundls管線
BuildPipeline.BuildAssetBundles4. 卸載不使用的AssetBundls
AssetBundle.unload(true) // false會有引用丟失的風險tips:開發一個良好的分離下載系統是至關重要的
自動打包至指定文件夾
- 自動添加label
- 根據label進行打包
- 刪除所有的AB包
生成MD5校驗文件
using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; using ABFW;namespace HotUpdateModel {public class CreateVerifyFiles{[MenuItem("AssetBundleTools/Create Verify Files")]public static void CreateFileMethod(){string abOutPath = ABPath.GetABOutPath();string verifyOutPath = abOutPath + "/ProjectVerifyFile.txt";List<string> fileList = new List<string>();if (File.Exists(verifyOutPath)){File.Delete(verifyOutPath);}ListFiles(new DirectoryInfo(abOutPath), ref fileList);WriteVerifyFile(verifyOutPath, fileList);}private static void ListFiles(FileSystemInfo fileSystemInfo, ref List<string> fileList){DirectoryInfo dirInfo = fileSystemInfo as DirectoryInfo;FileSystemInfo[] fileSysInfo = dirInfo.GetFileSystemInfos();foreach (FileSystemInfo item in fileSysInfo){FileInfo fileInfo = item as FileInfo;if (fileInfo != null){// 文件類型string strFileFullName = fileInfo.FullName.Replace("\\", "/");string fileExt = Path.GetExtension(strFileFullName);if (fileExt.EndsWith(".meta") || fileExt.EndsWith(".bak")){continue;}fileList.Add(strFileFullName);}else{// 目錄類型,繼續遞歸ListFiles(item, ref fileList);}}}/// <summary>/// 把文件名稱+對應的MD5寫入文件/// </summary>/// <param name="verifyFileOutPath">驗證文件的路徑</param>/// <param name="fileLists">所有合法文件的相對路徑集合</param>private static void WriteVerifyFile(string verifyFileOutPath, List<string> fileLists){Debug.Log("verifyFileOutPath" + verifyFileOutPath);using (FileStream fs = new FileStream(verifyFileOutPath, FileMode.CreateNew)){using (StreamWriter sw = new StreamWriter(fs)){for (int i = 0; i < fileLists.Count; i++){string strFile = fileLists[i];string strFileMD5 = Helps.GetMD5Value(strFile);string strTrueFileName = strFile.Replace(ABPath.GetABOutPath() + "/", string.Empty);sw.WriteLine(strTrueFileName + "|" + strFileMD5);}}}AssetDatabase.Refresh();}} }拷貝Lua腳本至指定文件夾
using UnityEngine; using UnityEditor; using System.IO; using ABFW;public class CopyLuaFileToStreamAssets {private static string _LuaIRPath = Application.dataPath + "/" + ABPath.LUA_RESOURCE_PATH;private static string _CopyTargetIR = ABPath.GetABOutPath() + "/" + ABPath.LUA_DEPLOY_PATH;[MenuItem("AssetBundleTools/Copy LuaFile To StreamAssets")]public static void CopyLuaTo(){DirectoryInfo dirInfo = new DirectoryInfo(_LuaIRPath);FileInfo[] files = dirInfo.GetFiles();if (!Directory.Exists(_CopyTargetIR)){Directory.CreateDirectory(_CopyTargetIR);}// 逐個拷貝foreach (FileInfo infoObj in files){File.Copy(infoObj.FullName, _CopyTargetIR + "/" + infoObj.Name, true);}Debug.Log("---------拷貝完成,Lua文件已拷貝至發布區--------");AssetDatabase.Refresh();} }貼一個工具 游戲/VR應用性能診斷與優化 UWA框架
總結
以上是生活随笔為你收集整理的Unity资源管理--AssetBundle学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐系统浅浅的例子
- 下一篇: 令人失望的IE7Beta,仍然不支持We