zoukankan      html  css  js  c++  java
  • Prefab Assist插件

    资料

    Prefab文档: http://game.ceeger.com/Manual/Prefabs.html

    基础:基于NGUI制作组件的Prefab

    前言

    在一个游戏的UI中,有一些通用的组件,比如:按钮,消息框,内容框背景,文字输入框等等,这些控件在制作前期就需要统一规化好,利于后期的维护。

    虽说它们是通用的,但是它们之间还是存在差异的:差异:Label上文字不一样,按钮的Name不一样,按钮的WidthxHeight不一样,Depth不一样,position不一样;但它们也有相同点:按钮的SpriteName是一样,Label描边一样,Label字号一样

    imageimage

    我们的做法

    通常我们都会把这些通用的组件做成Prefab,然后在每一个UI页面中都使用同一个Prefab。这样做没有问题的,但如果美术改版,就要不小心这些Prefab了。如果你修改完某一个UI页面的通用Prefab之后,千万别点Applay,否则会出现所有UI的通用组件都是相同的(transform上的属性不相同)。

    这是为什么呢?

    因为所有UI的按钮都是链接到同一个Prefab,而到后期美术改版,某个地方改了Prefab,而按了Apply,所有UI的按钮都会发生改变。

    解决办法

    我们现在的解决办法是给个Prefab都添加一个XXXAssist的组件,用来固定它的不一样的属性,比如width,height,depth,gameobject的name等,然后修改的时候,只修改Prefab的相同属性

    --------2015-12月补充:如果是UISprite/UITexture建议绑定sprite的Depth,sprite的width和height,还有sprite gameobject的name,和position,也可以只有spriteName和九宫格切图保持和共用prefab一致 其它都绑定,方便后期的维护-----------------

    1、绑定的组件简单代码如下:只有基础的功能,可按需添加

    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 绑定在通用的背景Prefab上
    /// </summary>
    [ExecuteInEditMode]//在编辑器模式下可执行
    public class CCommBgHelper : MonoBehaviour
    {
        public GameObject BindObject;
    
        public int Width = 200;
        public int Height = 200;
    
    //只在美术工程执行
    #if GAME_ART
        // Update is called once per frame
        public virtual void Update()
        {
            if (BindObject != null)
            {
                var tex = BindObject.GetComponent<UIWidget>();
                tex.width = Width;
                tex.height = Height;
                //CDebug.Log("update size");
            }
        }
    #endif
    }

    2、写了一个Editor的小工具,把所有场景的通用Prefab都绑定一下

    注:首先我们所有的UI的结构都是如下,并且所有的UI都放在统一的目录下

    imageimage

    [MenuItem("Game/UI/通用背景整理")]
    public static void BindCommBgPrefab()
        {
            bool changed = false;
            //遍历所有的UI
            foreach (var uiScene in Directory.GetFiles("Assets/" + CCosmosEngineDef.ResourcesBuildDir + "/UI/", "*.unity"))
            {
                EditorApplication.OpenScene(uiScene);//打开它
                var theMainWindow = GameObject.Find("Window");
    
                if (theMainWindow)
                {
                    var commAtlas = (UIAtlas) AssetDatabase.LoadAssetAtPath("Assets/UI/Atlas/CommonAtlas.prefab", typeof (UIAtlas));
                    //遍历所有的Sprite,包括隐藏的
                    foreach (var sprite in theMainWindow.GetComponentsInChildren<UISprite>(true))
                    {
                        //同一图集,并且名字相同
                        if (sprite.spriteName == "xxx" && sprite.atlas == commAtlas)
                        {
                            CDebug.Log("Scene:{0} 
     CommBgSprite: {1}", EditorApplication.currentScene, sprite.name);
                            //XXXX执行绑定功能
                            changed = true;
                        }
                    }
                }
            }
            if (changed)
                EditorApplication.SaveScene(); 
        }

    代码的意思就是:遍历所有的UI页面,找到Prefab,并添加绑定

    当添加绑定组件时,在资源打包后, 在客户端运行是没有影响的,因为组件中的预编译命令#if GAME_ART 只在美术库工程执行。

    当共用的部分,比如按钮图片发生改变时,只需要更改Project视图的Button.Prfab的图片,所有的Button的图也发生修改。而其它未改动的部分则保持不变。

    资源规范加上写一些Editor小工具,可以很方便的实现批量修改,提高工作效率。

  • 相关阅读:
    图解JAVA对象的创建过程
    统计机器学习
    排序算法简介及其C实现
    linux中强大的screen命令
    C语言注释
    Hello hadoop——使用hadoop进行大规模数据的全局排序
    Hadoop Streaming框架使用(二)
    shell——tr的用法
    统计学习方法《文本分类(三)》
    hadoop 常存问题
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/4519242.html
Copyright © 2011-2022 走看看