• [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包错误!
    [错误信息]
    {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("读取资源失败!
    [错误信息]
    {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变量上:

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

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

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

  • 相关阅读:
    装饰器的写法以及应用环境
    面向对象中super的作用
    os与sys模块的作用与常用方法
    python re模块
    python 冒泡排序,二分法
    正则表达式
    python 高阶内置函数
    python 内置函数
    python 生成器和生成器表达式
    python 函数名的应用(第一类对象),闭包,迭代器
  • 原文地址:https://www.cnblogs.com/Miku-CEB-Bug/p/11520547.html
Copyright © 2020-2023  润新知