一、AssetBundle 打包及加载
1. 打包
利用官方AssetBundle 管理工具AssetBundles-Browser
导入 AssetBundles-Browser
从github下载源码,直接拷贝到项目的Asset文件夹下,启动项目后就可以在Window菜单下看到AssetBundles-Browser子菜单了。
添加资源为AsseBundle
- 打开AssetBundles-Browser子菜单,弹出一个操作框
- 点击Configure Table,在子项内右键选择'add new bundle'
- 把资源拖到新建的bundle里
配置
- 添加完资源后,点击Build Table, 点击Build Target 栏,选择 Standalone windows
- 配置好**Target **和 Output,也可以打开 Advanced Settings 对 AssetBundle打包参数进行自定义配置,一般保持默认就好。
打包
- 点击Build按钮,开始打包。
或者直接调用接口进行打包
BuildPipeline.BuildAssetBundles("Assets/AssetBundles")
2. 加载jAssetBundle
AssetBundle ab = AssetBundle.LoadFromFile(path);
GameObject obj = ab.LoadAsset<GameObject>("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<GameObject>("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()方法中处理好,这个配置文件及其解码的的复杂度就可以大大降低了。
网友评论