如果已经看过本章节:目录传送门:这是目录鸭~
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 /// 16 /// AB包管理基类 17 /// 18 public class AssetBundleManager : MonoBehaviour 19 { 20 #region 公共变量 21 22 /// 23 /// AB包根路径(尾部已带斜杠) 24 /// 25 public static string _assetBundleRootPath = Application.streamingAssetsPath+"/AssetBundles/"; 26 27 #endregion 28 #region 私有变量 29 /// 30 /// 临时存放AB包类的字典 31 /// 32 private static Dictionary _tempAssetBundles = new Dictionary(); 33 #endregion 34 /// 35 /// 根据路径取得AB包 36 /// 37 /// 路径 38 /// 返回类(失败返回null) 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 /// 62 /// 删除AB包(别直接用) 63 /// 64 /// 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 /// 73 /// 用于返回的类 74 /// 75 public class PackageForAssetBundle 76 { 77 78 /// 79 /// AB包 80 /// 81 private AssetBundle _abPackage=null; 82 /// 83 /// 路径 84 /// 85 private readonly string _path = ""; 86 87 /// 88 /// 实例化时候需要输入的数据 89 /// 90 /// AssetBundle包 91 /// 路径 92 public PackageForAssetBundle(AssetBundle ab, string path) 93 { 94 _abPackage = ab;//设置这个类里面的变量 95 _path = path;//设置这个类的路径 96 } 97 98 /// 99 /// 获取路径100 /// 101 /// 路径102 public string GetPath()103 {104 return _path;//给你路径~105 }106 /// 107 /// 获取AB包108 /// 109 /// AB包110 public AssetBundle GetAssetBundle()111 {112 return _abPackage;113 }114 /// 115 /// 卸载AB包116 /// 117 /// 这个设置false会造成残留,切换场景将会把残留全部清除118 public void UnLoadAssetBundle(bool bol)119 {120 121 AssetBundleManager.DestroyAssetBundle(this,bol);//删除122 }123 /// 124 /// 读取资源...(类型需要转换)125 /// 126 /// 资源名字127 /// 返回资源,null为读取失败128 public Object GetAsset(string _name)129 {130 //抓捕错误131 try132 {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 : MonoBehaviour15 {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 : MonoBehaviour13 {14 /// 15 /// 生成时候用到的父对象,16 /// 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.assetbundle22 //上面的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变量上:
然后我们就可以看到我们帅气的阿离出现在了场景中~~~
到这步就结束啦~如果有我文章有好的建议的不妨说一下哟~(花费了一晚上,头发又少了几根)
目录传送门:这是目录鸭~