[1]嘗試用Unity3d制作一個王者榮耀(持續更新)->AssetBundle管理器


如果已經看過本章節:目錄傳送門:這是目錄鴨~

1.AssetBundleManager:

首先我們創建一個文件夾,叫AssetBundleManager,再創建Csharp(即C#)腳本,名為AssetBundleManager(這個代碼是作為我們管理AB包的基類)。以下是代碼(詳細注釋啦~,這個代碼后面可能會經常改動):

  1 /*
  2  * 編輯者:Miku醬
  3  * 版本:1
  4  * 首次編寫日期:2019/09/14 21:00
  5  * 修改日期:2019/09/14 21:00
  6  * 強行加一行~~~
  7  */
  8 
  9 using System.Collections;
 10 using System.Collections.Generic;
 11 using UnityEngine;
 12 
 13 namespace LuoHao.AssetBundleManager//命名空間,可以自己定義,我的格式是 名字拼音.功能名字;
 14 {
 15     /// <summary>
 16     /// AB包管理基類
 17     /// </summary>
 18     public class AssetBundleManager : MonoBehaviour
 19     {
 20         #region 公共變量
 21        
 22         /// <summary>
 23         /// AB包根路徑(尾部已帶斜杠)
 24         /// </summary>
 25         public static string _assetBundleRootPath = Application.streamingAssetsPath+"/AssetBundles/";
 26 
 27         #endregion
 28         #region 私有變量
 29         /// <summary>
 30         /// 臨時存放AB包類的字典
 31         /// </summary>
 32         private static Dictionary<string,PackageForAssetBundle> _tempAssetBundles = new Dictionary<string, PackageForAssetBundle>();
 33         #endregion
 34         /// <summary>
 35         /// 根據路徑取得AB包
 36         /// </summary>
 37         /// <param name="path">路徑</param>
 38         /// <returns>返回類(失敗返回null)</returns>
 39         public static PackageForAssetBundle GetAssetBundle(string path)
 40         {
 41             //Try里面抓取錯誤
 42             try
 43             {
 44                 if (_tempAssetBundles.ContainsKey(path))//存在則直接讀取
 45                 {
 46                     return _tempAssetBundles[path];
 47                 }
 48                 
 49              AssetBundle ab=   AssetBundle.LoadFromFile(_assetBundleRootPath+path);//從文件加載AB包
 50              PackageForAssetBundle pfa = new PackageForAssetBundle(ab,path);//創建准備返回的值
 51                 _tempAssetBundles.Add(path, pfa);//加入字典
 52                 return pfa; //返回
 53             }
 54             catch(System.Exception error)
 55             {
 56                 Debug.LogErrorFormat("讀取AB包錯誤!\n[錯誤信息]\n{0}",error.Message);//抓取錯誤信息
 57                 return null;//返回
 58             } 
 59             
 60         }
 61         /// <summary>
 62         /// 刪除AB包(別直接用)
 63         /// </summary>
 64         /// <param name="package"></param>
 65         public static void DestroyAssetBundle(PackageForAssetBundle package,bool bol)
 66         {
 67             package.GetAssetBundle().Unload(bol);//卸載AB包
 68             _tempAssetBundles.Remove(package.GetPath());//字典移除
 69         }
 70     }
 71 
 72     /// <summary>
 73     /// 用於返回的類
 74     /// </summary>
 75     public class PackageForAssetBundle
 76     {    
 77         
 78         /// <summary>
 79     /// AB包
 80     /// </summary>
 81         private  AssetBundle _abPackage=null;
 82         /// <summary>
 83         /// 路徑
 84         /// </summary>
 85         private readonly string _path = "";
 86 
 87         /// <summary>
 88         /// 實例化時候需要輸入的數據
 89         /// </summary>
 90         /// <param name="ab">AssetBundle包</param>
 91         /// <param name="path">路徑</param>
 92         public PackageForAssetBundle(AssetBundle ab, string path)
 93         {
 94             _abPackage = ab;//設置這個類里面的變量
 95             _path = path;//設置這個類的路徑
 96         }
 97 
 98         /// <summary>
 99         /// 獲取路徑
100         /// </summary>
101         /// <returns>路徑</returns>
102         public string GetPath()
103         {
104             return _path;//給你路徑~
105         }
106         /// <summary>
107         /// 獲取AB包
108         /// </summary>
109         /// <returns>AB包</returns>
110         public AssetBundle GetAssetBundle()
111         {
112             return _abPackage;
113         }
114         /// <summary>
115         /// 卸載AB包
116         /// </summary>
117         /// <param name="bol">這個設置false會造成殘留,切換場景將會把殘留全部清除</param>
118         public void UnLoadAssetBundle(bool bol)
119         {
120            
121             AssetBundleManager.DestroyAssetBundle(this,bol);//刪除
122         }
123         /// <summary>
124         /// 讀取資源...(類型需要轉換)
125         /// </summary>
126         /// <param name="_name">資源名字</param>
127         /// <returns>返回資源,null為讀取失敗</returns>
128         public  Object GetAsset(string _name)
129         {
130             //抓捕錯誤
131             try
132             {
133              Object  obj =_abPackage.LoadAsset(_name);//讀取資源
134 
135                 return obj;//返回
136             }
137             catch (System.Exception error)
138             {
139                 Debug.LogErrorFormat("讀取資源失敗!\n[錯誤信息]\n{0}", error.Message);//抓取錯誤信息
140                 return null;//返回
141             }
142         }
143     }
144 }

 

2.打包AssetBundle:

首先我們得創建一個名為Editor的文件夾(該文件夾的文件不會被打包,是編輯器擴展文件的存放文件夾,詳情請百度),並在此文件夾創建子文件夾,名為Scripts(存放代碼的emmm,所有的文件/文件夾名字一定要英文名字,中文等英文除外的名字不知道會發生什么鬼錯誤)。

文件夾創建完畢后,再在Scripts文件夾下面創建一個名為AssetBundlesTools的C#腳本,用於打包AssetBundle的。以下是代碼(詳細注釋啦~):

 1 /*
 2  * 編輯者:Miku醬
 3  * 版本:1
 4  * 首次編寫日期:2019/09/14 20:00
 5  * 修改日期:2019/09/14 20:00
 6  * 強行加一行~~~
 7  */
 8 
 9 using System.IO;//I/O文件讀寫,這里用於文件夾的存在檢測以及創建
10 using UnityEditor;//引入Unity編輯器類
11 using UnityEngine;
12 using LuoHao.AssetBundleManager;//引入AssetBundleManager命名空間
13 
14 public class AssetBundlesTools : MonoBehaviour
15 {
16     [MenuItem("AssetsBundle/Build AssetBundles(Android)")]//在工具欄創建按鈕
17     static void BuildAllAssetBundles()//進行打包的方法
18     {
19         string dir = AssetBundleManager._assetBundleRootPath;//根據AssetBundleManager獲取根路徑
20         //判斷該目錄是否存在
21         if (Directory.Exists(dir) == false)
22         {
23             Directory.CreateDirectory(dir);//在工程下創建AssetBundles目錄
24         }
25         //參數一為打包到哪個路徑,參數二壓縮選項(默認)  參數三 平台的目標(安卓)
26         BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.Android);
27         Debug.Log("打包Okay啦~~~");
28     
29     }
30     
31 }

3.創建AssetBundle以及讀取測試:

A.設置標簽:

選擇一個預制體(Perfab),在屬性面板看到右下角的標簽設置,點擊右小角左邊的那個按鈕,新增並設置名字:

然后在點擊右邊的那個,新增並設置后綴(一般AssetBundle),如圖:

最后變成這樣~

 

B.打包AssetBundle:

上面第二步驟創建了一個打包的代碼,並在工具欄新增了按鈕,於是我們看到:

點擊內個按鈕,等待打包~~~

打包成功后我們可以看到控制台打出的信息,並且可以在StreamingAsset文件夾看到我們的文件,如果看不到請刷新編輯器(代碼里面打包成功后也可以加一句),如圖:

C.測試讀取AssetBundle:

隨意位置創建一個名為Test(隨意名字)的Csharp(即C#):

代碼如下~~~

 1 /*
 2  * 編輯者:Miku醬
 3  * 版本:1
 4  * 首次編寫日期:2019/09/14 22:00
 5  * 修改日期:2019/09/14 22:00
 6  * 強行加一行~~~
 7  */
 8 using System.Collections;
 9 using System.Collections.Generic;
10 using UnityEngine;
11 using LuoHao.AssetBundleManager;//引入命名空間
12 public class Test : MonoBehaviour
13 {
14     /// <summary>
15     /// 生成時候用到的父對象,
16     /// </summary>
17     public Transform _father;
18     void Start()
19     {
20         PackageForAssetBundle pack = AssetBundleManager.GetAssetBundle("1002_gongsunli_show_model.assetbundle");
21         //讀取AB包,sting字符串為剛剛設置的標簽 格式 名字.后綴 就像我的1002_gongsunli_show_model.assetbundle
22         //上面的string字符串可以不用區分大小寫
23 
24 
25         GameObject gm = pack.GetAsset("1992_Li_Show1_Pure") as GameObject;
26         //里面的string字符串為打包時候的被標簽標記的文件的預制體名字(如果標記的是文件夾則) 
27         //as GameObject是轉化了下格式(Object->GameObject)
28 
29 
30         gm = Instantiate(gm, _father);//實例化物體(生成物體在場景中)
31         gm.transform.localPosition = Vector3.zero;//設置坐標
32 
33        
34     }
35 
36 
37 }

把代碼掛到任意一個物體上,把父物體拖入到代碼_father變量上:

然后我們就可以看到我們帥氣的阿離出現在了場景中~~~

到這步就結束啦~如果有我文章有好的建議的不妨說一下喲~(花費了一晚上,頭發又少了幾根)

目錄傳送門:這是目錄鴨~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM