[Unity3d][NGUI]打包NGUI预制件成Assetbundle 两种思路.

http://www.58player.com/blog-2537-85030.html

接上文,项目中因为需要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");
        
                    // 生成assetbundle
                    BuildPipeline.BuildAssetBundle(objs[0], null,
                           _savepath,
                           m_option,
                           EditorUserBuildSettings.activeBuildTarget);
                }
                else
                {
                    // 获取保存路径
                    _savepath = EditorUtility.SaveFolderPanel("Save Resources", "", "");
        
                    // 生成assetbundle
                    for (int i = 0; i < objs.Length; ++i)
                    {
                        BuildPipeline.BuildAssetBundle(objs[i], null,
                            _savepath + "/" + objs[i].name + ".assetbundle",
                            m_option,
                            EditorUserBuildSettings.activeBuildTarget);
                    }
                }
            }
        }
         
        这就是我最开始写的将NGUI预制件打包成Assetbundle的方法. 这个方法看起来没啥问题,使用WWW流加载也没有问题. 但是真的如此吗?   
        其实我一开始也没有注意到AssetBundle中的资源依赖关系这个问题. 
        因为我最开始生成的几个Assetbundle0均是ngui演示中的几个预制件,生成出来的大小比较正常一般几K到几十K. 
          
        于是我天真的以为就这么用就好了. 
        直到我开始做几个需要中文文本支持的界面时,才发现我跳进了一个小坑. 
          
        TODO:................. 
          
        PS:这个Blog嘛 不算啥专业的技术Blog,只是随笔.

时间: 2024-10-13 00:40:12

[Unity3d][NGUI]打包NGUI预制件成Assetbundle 两种思路.的相关文章

[Unity3d][NGUI]两种思路解决AssetBundle的依赖关系.

接上文. 使用上文中的AssetBundle打包方式生成的文件包括了依赖关系中的文件. 一般的使用中并不会发现什么问题. 可是当配合NGUI的时候,使用dynamicFont时打包AssetBundle会将每一个组件使用的dynamicFont都分开打包进去. 导出函数请參考:导出资源 导出资源包时出现的问题: 如图: 在解决依赖关系上我使用过2种方案: 第一种是使用BuildPipeline中的PushAssetDependencies和PopAssetDependencies方法来解决依赖关

点击页面div弹窗以外隐藏的两种思路

在本文为大家介绍两种思路实现点击页面其它地方隐藏该div,第一种是对document的click事件绑定事件处理程序.. 第一种思路分两步 第一步:对document的click事件绑定事件处理程序,使其隐藏该div 第二步:对div的click事件绑定事件处理程序,阻止事件冒泡,防止其冒泡到document,而调用document的onclick方法隐藏了该div. <script type="text/javascript"> function stopPropagat

二元查找树的翻转(镜像)的两种思路

问题描述: 输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点. 算法: 测试用例: 10 /             \ 5               11 /        \ 3            7 /     \         /   \ 2       4     6      9 /                       / 1                       8 算法: 有两种思路: ①递归.对树翻转,只

Submission Details [leetcode] ---- inplace 线性时间 的两种思路

两种思路都利用了输入的数组A,若A中存在i,则给A[i]作为标记. 因为A中的n个元素存在>n和<=0的,所以第一个缺失的正整数一定在[1-n+1]之间. 第一种思路是将标记设为一个特定的数.因为改变数值会影响该位置原来存的值,所以需要在一个循环里依次处理所有"原来的值". 例如数组为{2,3,4,1}.对第一个数2,我们将位置(2-1)=1标记为-MAX_INT,数组变为{2,-MAX_INT,4,1},丢失了3,所以应记录下数组原来的值,并继续将位置(3-1)=2标记为

[LeetCode] Maximum Product Subarray的两种思路

Find the contiguous subarray within an array (containing at least one number) which has the largest product. For example, given the array [2,3,-2,4], the contiguous subarray [2,3] has the largest product = 6. 这题和之前的一题Maximum Subarray非常类似,一个是求最大和,而这个是

Letter Combinations of a Phone Number [leetcode]谈谈循环解法的两种思路

本系列博文中有很多两种思路的,其实是因为第一遍刷题的时候有一个想法,第二遍刷题的时候已经忘掉之前的思路了,又有新的想法了. 同时大部分代码我也同时PO到leetcode的对应题目的问答中去了,所以如果你也查看问题讨论的话会发现有和我一模一样的代码,其实就是我PO的:) 书接正文,基于循环的两种思路如下: 第一种思路 比如"234"这个字符串,我可以先将0...1的所有排列找到-->{"a", "b", "c"} 再进一步

详谈排序算法之插入类排序(两种思路实现希尔排序)

1. 排序( sorting) 的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.其确切的定义为: 假设有n个数据元素的序列{R1 , R2 , - , Rn},其相应关键字的序列是{K1 , K2 , - , Kn} ,通过排序要求找出下标 1 , 2 , - , n的一种排列p1 , p2 , - , pn,使得相应关键字满足如下的非递减(或非递增)关系Kp1 ≤ Kp2 ≤ - ≤ Kpn这样,就得到一个按关键字有序的纪录序列{ Rp1 , Rp2 , - , Rpn }

Reorder List [leetcode] 的两种思路

第一种思路是用一个vector存所有的Node* 之后再用两个指针将链表拼接出来 void reorderList(ListNode *head) { vector<ListNode*> content; ListNode * cur = head; while (cur) { content.push_back(cur); cur = cur->next; } int size = content.size(); cur = NULL; for (int i = 0; i <=

Jump Game II (leetcode) DP的两种思路

第一种思路是: dp(i):到位置i所需要的最少步数 dp(i)一定是递增的,所以从j=A[i]开始(从最远的位置开始),更新数组直到dp(j+i) <= dp(i) + 1为止 如果去掉,会TLE int jump(int A[], int n) { int* dp = new int[n];//dp[i]到i所需的最小步数 memset(dp, 0x3f, sizeof(int) * n); dp[0] = 0; for (int i = 0; i < n; i++) { for (int