日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity资源管理--AssetBundle学习

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.LoadFromCacheOrDownload

2. 從AssetBundles中加載Assets

LoadAsset(LoadAssetAsync) // 加載單個或者少量時使用 LoadAllAssets(LoadAllAssetsAsync) // 加載多數或者所有Assets時使用 LoadAssetWithSubAssets(LoadAssetWithSubAssetsAsync)

3. 構建AssetBundls管線

BuildPipeline.BuildAssetBundles

4. 卸載不使用的AssetBundls

AssetBundle.unload(true) // false會有引用丟失的風險

tips:開發一個良好的分離下載系統是至關重要的


自動打包至指定文件夾

  • 自動添加label
using UnityEngine; using UnityEditor; using System.IO;namespace ABFW {public class AutoSetLabels{[MenuItem("AssetBundleTools/Set AB Label")]public static void SetABLable(){// 清空標記AssetDatabase.RemoveUnusedAssetBundleNames();// AB根目錄 調用文件ABPath.cs統一獲取路徑string strNeedSetlabelRoot = ABPath.GetABResourcesPath();// 通過根路徑獲取目錄DirectoryInfo dirTempInfo = new DirectoryInfo(strNeedSetlabelRoot);DirectoryInfo[] dirSceneDirArray = dirTempInfo.GetDirectories();// 遍歷所有路徑foreach (DirectoryInfo currentDIR in dirSceneDirArray){Debug.Log("輸出目錄所有" + currentDIR);string tmpScenesDIR = strNeedSetlabelRoot + "/" + currentDIR.Name;int tmpIndex = tmpScenesDIR.LastIndexOf("/");string tmpScenesName = tmpScenesDIR.Substring(tmpIndex + 1);JudgeDIRorFileByRecursive(currentDIR, tmpScenesName);}// 刷新列表AssetDatabase.Refresh();Debug.Log("-----------------AB初始化完成--------------------");}/// <summary>/// 遞歸判斷是否為目錄/文件,修改AssetBundle/// </summary>/// <param name="fileSysInfo">目錄信息</param>/// <param name="scenesName">場景名稱</param>private static void JudgeDIRorFileByRecursive(FileSystemInfo fileSysInfo, string scenesName){if (!fileSysInfo.Exists){Debug.Log("文件或者目錄名稱:" + fileSysInfo + "不存在,請檢查");return;}DirectoryInfo dirInfoObj = fileSysInfo as DirectoryInfo;FileSystemInfo[] fileSysArray = dirInfoObj.GetFileSystemInfos();// 遍歷文件 設置標簽foreach (FileSystemInfo fileInfo in fileSysArray){FileInfo fileInfoObj = fileInfo as FileInfo;if (fileInfoObj != null){// 文件類型 設置lableSetFilesABLabel(fileInfoObj, scenesName);}else{// 目錄文件 遞歸JudgeDIRorFileByRecursive(fileInfo, scenesName);}}}/// <summary>/// 設置AB標簽/// </summary>/// <param name="fileInfoObj">文件信息</param>/// <param name="scenesName">場景名稱</param>private static void SetFilesABLabel(FileInfo fileInfoObj, string scenesName){if (fileInfoObj.Extension == ".meta") return;// AB名string strABName = GetABName(fileInfoObj, scenesName);// 獲取文件的相對路徑,從Assets/開始int tmpIndex = fileInfoObj.FullName.IndexOf("Assets");string strAssetFilepath = fileInfoObj.FullName.Substring(tmpIndex);AssetImporter tmpImporterObj = AssetImporter.GetAtPath(strAssetFilepath);// 設置AB名tmpImporterObj.assetBundleName = strABName;// 根據拓展名設置AB后綴if (fileInfoObj.Extension == ".unity"){tmpImporterObj.assetBundleVariant = "u3d";} else{tmpImporterObj.assetBundleVariant = "ab";}}/// <summary>/// 獲取AB包的名稱/// </summary>/// <param name="fileInfoObj"></param>/// <param name="scenesName"></param>/// <returns></returns>private static string GetABName(FileInfo fileInfoObj, string scenesName){string tmpWinPath = fileInfoObj.FullName;string tmpUnityPath = tmpWinPath.Replace("\\", "/");// 場景名稱后面的字符數int tmpSceneNameposition = tmpUnityPath.IndexOf(scenesName) + scenesName.Length;// 拓展名區域string strABFileNameArea = tmpUnityPath.Substring(tmpSceneNameposition + 1);string strABName;if (strABFileNameArea.Contains("/")){string[] tmpStrArray = strABFileNameArea.Split('/');strABName = scenesName + "/" + tmpStrArray[0];}else{strABName = scenesName + "/" + scenesName;}return strABName;}} }
  • 根據label進行打包
using System.IO; using UnityEditor; using UnityEngine;namespace ABFW {public class BuildAssetsBundle{[MenuItem("AssetBundleTools/Build All AB")]public static void BuildAllAB(){// 創建目錄string strABOutPathDIR = ABPath.GetABOutPath();if (!Directory.Exists(strABOutPathDIR)){Directory.CreateDirectory(strABOutPathDIR);}// 調用內置API打包BuildPipeline.BuildAssetBundles(strABOutPathDIR, BuildAssetBundleOptions.None, BuildTarget.StandaloneOSX);}}}
  • 刪除所有的AB包
using System.IO; using UnityEditor; using UnityEngine;namespace ABFW {public class DeleteAssetsBundle : MonoBehaviour{[MenuItem("AssetBundleTools/Delete All AB")]public static void DeleteAllBundle(){string strNeedDeleteDIR = ABPath.GetABOutPath();if (!string.IsNullOrEmpty(strNeedDeleteDIR)){Directory.Delete(strNeedDeleteDIR, true);File.Delete(strNeedDeleteDIR + ".meta ");AssetDatabase.Refresh();} else{Debug.LogError("無可刪除的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学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。