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} \n CommBgSprite: {1}", EditorApplication.currentScene, sprite.name);
                        //XXXX执行绑定功能
                        changed = true;
                    }
                }
            }
        }
        if (changed)
            EditorApplication.SaveScene(); 
    }
复制代码

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

 

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

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

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




本文转自赵青青博客园博客,原文链接:http://www.cnblogs.com/zhaoqingqing/p/4519242.html,如需转载请自行联系原作者

相关文章
|
开发者
「代码强迫症?」从0到1实现项目代码拼写检查 vscode 插件:project-spell-checker(一)
「代码强迫症?」从0到1实现项目代码拼写检查 vscode 插件:project-spell-checker(一)
272 0
|
8月前
CTK框架 - 将菜单按钮写到插件中
之前我们在的两个插件Core和About,在Core和About中加入了界面,并且Core中插入了一个菜单,点击之后弹出About界面。 我们现在来用之前的知识把菜单改成注册的,并且点击之后弹出About界面。 我这里的思路是使用事件或者是在Core中加注册的服务来注册菜单。之后点击菜单的时候发送事件。
64 0
|
XML 数据格式
IDEA下找不到diagrams按钮选项的解决方案
IDEA下找不到diagrams按钮选项的解决方案
725 0
IDEA下找不到diagrams按钮选项的解决方案
|
存储 自然语言处理 API
「代码强迫症?」从0到1实现项目代码拼写检查 vscode 插件:project-spell-checker(二)
「代码强迫症?」从0到1实现项目代码拼写检查 vscode 插件:project-spell-checker(二)
338 0
|
XML Java Android开发
eclipse安装完对应的sts插件后按alt+/却不能提示属性值
eclipse安装完对应的sts插件后按alt+/却不能提示属性值
147 0
eclipse安装完对应的sts插件后按alt+/却不能提示属性值
|
Dart
Flutter:删除所有已保存的shared_preferences首选项
dart - Flutter:删除所有已保存的shared_preferences首选项 想在用户点击注销时删除所有保存的shared_preferences首选项。有什么方法可以一次性完成而不删除一个吗?
183 0
|
图形学
[Unity Editor] 清理Prefab使用的特定组件
工具实现 修改Prefab有两种方式,1)实例化Prefab,修改GameObject的实例,然后再替换工程里的资源(SaveAsPrefabAsset)。2)通过SerializedObject直接修改Prefab资源。
2406 0
EMF+GEF的属性页问题
最近有朋友问使用EMF作为GEF模型时,如何在选中editpart时在属性页里显示属性的问题。是的,因为GEF是这样判断是否填充属性 页的: public Object getAdapter(Class key) {     if (IPropertySource.
1303 0
|
图形学 数据可视化
用SublimeText当Unity Shader的编辑器
用Visual Studio写shader实在蛋疼,那可能就会有人要问了,为啥不用插件可视化制作shader呢?因为我是新手,新手还是老老实实敲代码,慢慢来…   所以试着在网上找找,有没有类似的插件或者编辑器,被我找到了,也基本符合我的要求。
1847 0