[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变量上:

然后我们就可以看到我们帅气的阿离出现在了场景中~~~

到这步就结束啦~如果有我文章有好的建议的不妨说一下哟~(花费了一晚上,头发又少了几根)

目录传送门:这是目录鸭~

posted @ 2019-09-14 22:15 Miku~ 阅读(...) 评论(...) 编辑 收藏