如果已經(jīng)看過本章節(jié):目錄傳送門:這是目錄鴨~ <https://www.cnblogs.com/Miku-CEB-Bug/p/11509708.html>
<https://www.cnblogs.com/Miku-CEB-Bug/p/11509708.html>
1.AssetBundleManager:
首先我們創(chuàng)建一個(gè)文件夾,叫AssetBundleManager,再創(chuàng)建Csharp(即C#)腳本,名為AssetBundleManager(這個(gè)代碼是作為我們管理AB包的基類)。以下是代碼(詳細(xì)注釋啦~,
這個(gè)代碼后面可能會(huì)經(jīng)常改動(dòng)):
1 /* 2 * 編輯者:Miku醬 3 * 版本:1 4 * 首次編寫日期:2019/09/14 21:00 5 *
修改日期:2019/09/14 21:00 6 * 強(qiáng)行加一行~~~ 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 /// 臨時(shí)存放AB包類的字典 31 /// </summary> 32
private static Dictionary<string,PackageForAssetBundle> _tempAssetBundles = new
Dictionary<string, PackageForAssetBundle>(); 33 #endregion 34 /// <summary>
35 /// 根據(jù)路徑取得AB包 36 /// </summary> 37 /// <param name="path">路徑</param> 38
/// <returns>返回類(失敗返回null)</returns> 39 public static PackageForAssetBundle
GetAssetBundle(string path) 40 { 41 //Try里面抓取錯(cuò)誤 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);//創(chuàng)建準(zhǔn)備返回的值 51
_tempAssetBundles.Add(path, pfa);//加入字典 52 return pfa; //返回 53 } 54 catch
(System.Exception error) 55 { 56 Debug.LogErrorFormat("讀取AB包錯(cuò)誤!\n[錯(cuò)誤信息]\n{0}"
,error.Message);//抓取錯(cuò)誤信息 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 ///
實(shí)例化時(shí)候需要輸入的數(shù)據(jù) 89 /// </summary> 90 /// <param name="ab">AssetBundle包</param>
91 /// <param name="path">路徑</param> 92 public
PackageForAssetBundle(AssetBundle ab,string path) 93 { 94 _abPackage = ab;//
設(shè)置這個(gè)類里面的變量 95 _path = path;//設(shè)置這個(gè)類的路徑 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">這個(gè)設(shè)置false會(huì)造成殘留,切換場(chǎng)景將會(huì)把殘留全部清除
</param> 118 public void UnLoadAssetBundle(bool bol) 119 { 120 121
AssetBundleManager.DestroyAssetBundle(this,bol);//刪除 122 } 123 /// <summary>
124 /// 讀取資源...(類型需要轉(zhuǎn)換) 125 /// </summary> 126 /// <param name="_name">資源名字
</param> 127 /// <returns>返回資源,null為讀取失敗</returns> 128 public Object GetAsset(
string _name) 129 { 130 //抓捕錯(cuò)誤 131 try 132 { 133 Object obj
=_abPackage.LoadAsset(_name);//讀取資源 134 135 return obj;//返回 136 } 137 catch
(System.Exception error)138 { 139 Debug.LogErrorFormat("讀取資源失敗!\n[錯(cuò)誤信息]\n{0}",
error.Message);//抓取錯(cuò)誤信息 140 return null;//返回 141 } 142 } 143 } 144 }
?
2.打包AssetBundle:
首先我們得創(chuàng)建一個(gè)名為Editor的文件夾(該文件夾的文件不會(huì)被打包,是編輯器擴(kuò)展文件的存放文件夾,詳情請(qǐng)百度),并在此文件夾創(chuàng)建子文件夾,名為Scripts(存放代碼的emmm,
所有的文件/文件夾名字一定要英文名字,中文等英文除外的名字不知道會(huì)發(fā)生什么鬼錯(cuò)誤)。
文件夾創(chuàng)建完畢后,再在Scripts文件夾下面創(chuàng)建一個(gè)名為AssetBundlesTools的C#腳本,用于打包AssetBundle的。以下是代碼(詳細(xì)注釋啦~):
1 /* 2 * 編輯者:Miku醬 3 * 版本:1 4 * 首次編寫日期:2019/09/14 20:00 5 *
修改日期:2019/09/14 20:00 6 * 強(qiáng)行加一行~~~ 7 */ 8 9 using System.IO;//
I/O文件讀寫,這里用于文件夾的存在檢測(cè)以及創(chuàng)建 10 using UnityEditor;//引入U(xiǎn)nity編輯器類 11 using
UnityEngine;12 using LuoHao.AssetBundleManager;//引入AssetBundleManager命名空間 13 14
public class AssetBundlesTools : MonoBehaviour 15 { 16 [MenuItem("
AssetsBundle/Build AssetBundles(Android)")]//在工具欄創(chuàng)建按鈕 17 static void
BuildAllAssetBundles()//進(jìn)行打包的方法 18 { 19 string dir =
AssetBundleManager._assetBundleRootPath;//根據(jù)AssetBundleManager獲取根路徑 20 //
判斷該目錄是否存在 21 if (Directory.Exists(dir) == false) 22 { 23
Directory.CreateDirectory(dir);//在工程下創(chuàng)建AssetBundles目錄 24 } 25 //
參數(shù)一為打包到哪個(gè)路徑,參數(shù)二壓縮選項(xiàng)(默認(rèn)) 參數(shù)三 平臺(tái)的目標(biāo)(安卓) 26 BuildPipeline.BuildAssetBundles(dir,
BuildAssetBundleOptions.None, BuildTarget.Android);27 Debug.Log("打包Okay啦~~~");
28 29 } 30 31 }
3.創(chuàng)建AssetBundle以及讀取測(cè)試:
A.設(shè)置標(biāo)簽:
選擇一個(gè)預(yù)制體(Perfab),在屬性面板看到右下角的標(biāo)簽設(shè)置,點(diǎn)擊右小角左邊的那個(gè)按鈕,新增并設(shè)置名字:
然后在點(diǎn)擊右邊的那個(gè),新增并設(shè)置后綴(一般AssetBundle),如圖:
最后變成這樣~
?
B.打包AssetBundle:
上面第二步驟創(chuàng)建了一個(gè)打包的代碼,并在工具欄新增了按鈕,于是我們看到:
點(diǎn)擊內(nèi)個(gè)按鈕,等待打包~~~
打包成功后我們可以看到控制臺(tái)打出的信息,并且可以在StreamingAsset文件夾看到我們的文件,如果看不到請(qǐng)刷新編輯器(代碼里面打包成功后也可以加一句),如圖:
C.測(cè)試讀取AssetBundle:
隨意位置創(chuàng)建一個(gè)名為Test(隨意名字)的Csharp(即C#):
代碼如下~~~
1 /* 2 * 編輯者:Miku醬 3 * 版本:1 4 * 首次編寫日期:2019/09/14 22:00 5 *
修改日期:2019/09/14 22:00 6 * 強(qiáng)行加一行~~~ 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 /// 生成時(shí)候用到的父對(duì)象, 16 /// </summary> 17 public Transform _father;
18 void Start() 19 { 20 PackageForAssetBundle pack =
AssetBundleManager.GetAssetBundle("1002_gongsunli_show_model.assetbundle"); 21
//讀取AB包,sting字符串為剛剛設(shè)置的標(biāo)簽 格式 名字.后綴 就像我的1002_gongsunli_show_model.assetbundle 22
//上面的string字符串可以不用區(qū)分大小寫 23 24 25 GameObject gm = pack.GetAsset("
1992_Li_Show1_Pure") as GameObject; 26 //
里面的string字符串為打包時(shí)候的被標(biāo)簽標(biāo)記的文件的預(yù)制體名字(如果標(biāo)記的是文件夾則)27 //as
GameObject是轉(zhuǎn)化了下格式(Object->GameObject) 28 29 30 gm = Instantiate(gm, _father);//
實(shí)例化物體(生成物體在場(chǎng)景中) 31 gm.transform.localPosition = Vector3.zero;//設(shè)置坐標(biāo) 32 33 34 }
35 36 37 }
把代碼掛到任意一個(gè)物體上,把父物體拖入到代碼_father變量上:
然后我們就可以看到我們帥氣的阿離出現(xiàn)在了場(chǎng)景中~~~
到這步就結(jié)束啦~如果有我文章有好的建議的不妨說一下喲~(花費(fèi)了一晚上,頭發(fā)又少了幾根)
目錄傳送門: <https://www.cnblogs.com/Miku-CEB-Bug/p/11509708.html>這是目錄鴨~
<https://www.cnblogs.com/Miku-CEB-Bug/p/11509708.html>
熱門工具 換一換