[Unity3d][NGUI]打包NGUI预制件成Assetbundle 两种思路.
接上文,项目中由于须要UI热更新,所以我使用了AssetBundle这个解决方式.
一般来说,我们使用AssetBundle生成资源包经常使用的方案是例如以下这么用:
using UnityEngine; using UnityEditor; /// <summary> /// 导出资源类 /// </summary> public class ExportGameResources { static BuildAssetBundleOptions m_option = BuildAssetBundleOptions.CollectDependencies | // 收集全部依赖关系 BuildAssetBundleOptions.DeterministicAssetBundle; /// <summary> /// 导出NGUI成Assetbundle /// </summary> [MenuItem("Assets/导出/资源")] static public void ExportNGUI() { // 获取编辑器中选择的项 Object[] objs = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets); // 没有选中项 if (objs.Length == 0) { return; } string _savepath = null; // 推断是多选还是单选 if (objs.Length == 1) { // 获取保存路径 _savepath = EditorUtility.SaveFilePanel("Save Resource", "", objs[0].name, "assetbundle"); if (!_savepath.Equals("")) { // 生成assetbundle BuildPipeline.BuildAssetBundle(objs[0], null, _savepath, m_option, EditorUserBuildSettings.activeBuildTarget); } } else { // 获取保存路径 _savepath = EditorUtility.SaveFolderPanel("Save Resources", "", ""); if (!_savepath.Equals("")) { // 生成assetbundle for (int i = 0; i < objs.Length; ++i) { BuildPipeline.BuildAssetBundle(objs[i], null, _savepath + "/" + objs[i].name + ".assetbundle", m_option, EditorUserBuildSettings.activeBuildTarget); } } } Debug.Log("导出成功,导出路径:" + _savepath); } }
这就是我最開始写的将NGUI预制件打包成Assetbundle的方法.
这种方法看起来没啥问题,使用WWW流载入也没有问题.
可是真的如此吗?
事实上我一開始也没有注意到AssetBundle中的资源依赖关系这个问题.
由于我最開始生成的几个Assetbundle0均是ngui演示中的几个预制件,生成出来的大小比較正常一般几K到几十K.
于是我天真的以为就这么用就好了.
直到我開始做几个须要中文文本支持的界面时,才发现我跳进了一个小坑.
TODO:.................
PS:这个Blog嘛 不算啥专业的技术Blog,仅仅是随笔.