AssetBundle资源管理设计知识整理

一、AssetBundle 打包及加载

1. 打包

利用官方AssetBundle 管理工具AssetBundles-Browser

导入 AssetBundles-Browser

从github下载源码,直接拷贝到项目的Asset文件夹下,启动项目后就可以在Window菜单下看到AssetBundles-Browser子菜单了。

添加资源为AsseBundle
  1. 打开AssetBundles-Browser子菜单,弹出一个操作框
  2. 点击Configure Table,在子项内右键选择'add new bundle'
  3. 把资源拖到新建的bundle里
配置
  1. 添加完资源后,点击Build Table, 点击Build Target 栏,选择 Standalone windows
  2. 配置好**Target **和 Output,也可以打开 Advanced Settings 对 AssetBundle打包参数进行自定义配置,一般保持默认就好。
打包
  1. 点击Build按钮,开始打包。
或者直接调用接口进行打包
BuildPipeline.BuildAssetBundles("Assets/AssetBundles")

2. 加载jAssetBundle

AssetBundle ab = AssetBundle.LoadFromFile(path);
GameObject obj = ab.LoadAsset("your game object name");
Instantiate(obj);

二、Script脚本打包进AssetBundle

1. C#脚本转为textAsset

C#脚本是无法直接打包进AssetBundle的,但是二进制数据及文本文件时可用打包进AssetBundle的,所以,问题就转到C#脚本如何打包成Dll格式的二进制包了。
详见 Unity脚本文件转为dll文件

2. 打包进AssetBundle

这个过程就比较简单了,重复上面提到的 3. 把资源拖到新建的bundle里,把编译后的脚本Dll包拖到bundle中,然后点击build,生成AssetBundle资源压缩包。

3. 本地从AssetBundle获取脚本

上面已经准备好了AssetBundle,最终,我们在目标项目把AssetBudle加载到进来,方式见上文的加载AssetBundle。
加载完了,就可以通过反射把脚本从AssetBundle中提取出来,再挂到对应的GameObuect上
具体实现代码如下

        // 加载assetbundle
        AssetBundle ab = AssetBundle.LoadFromFile(path);

        // 加载 gameobject
        GameObject obj = ab.LoadAsset("bdr40-1100-2");

        // 加载脚本
        TextAsset textAsset = ab.LoadAsset("OP_RobotArm_Dll.dll") as TextAsset;
        byte[] joints = textAsset.bytes;
        var asssembly = Assembly.Load(joints);
        var type = asssembly.GetType("Joint0");

        // 挂脚本
        GameObject JointObj = obj.transform.Find("Joint0").gameObject;
        JointObj.AddComponent(type);

        Instantiate(obj);

看了上面的代码实现后,另一个问题就来了,就是,我在目标工程师如何知道具体GameObject和脚本叫什么,又如何知道GameObject挂的上面脚本呢,这个就需要我们在打包AssetBundle时,实现处理,生成一个GameObject和脚本的映射表,把他们的映射关系配置化,这样在客户端就可以通过这个配置文件去处理GameObject和脚本的对应关系。

还有一个问题是,一些脚本的public的初始值,我们是通过IDE界面去设置的,就要改为在start()方法中处理好,这个配置文件及其解码的的复杂度就可以大大降低了。

你可能感兴趣的:(AssetBundle资源管理设计知识整理)