资料

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

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

前言

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

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

我们的做法

通常我们都会把这些通用的组件做成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 = ;
public int Height = ; //只在美术工程执行
#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都放在统一的目录下

[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小工具,可以很方便的实现批量修改,提高工作效率。

Prefab Assist插件的更多相关文章

  1. 关与 Visual.Assist.X.V10.7.1912的Crack破解补丁(vs 番茄插件的key破解方法)

    在win7系统下, 我用的是vs2012版本号. Visual Assist沿用了快10年的界面,最终有了更新,变得更加适合Win8 以及 VS2012的主题风格了 ,这也是以后软件的发展趋势,仅仅是 ...

  2. 升级 WIN8.1 VC6.0和 Visual Assist 的使用问题

    抱着好奇之心, 升级到了win8.1,没想到win8下 64位机器,原本可以运行的vc6.0(也就是 MSDEV.EXE)不能运行之,然后各种不痛快了. 经过从网上搜索,找到了改良办法,没想到微软想把 ...

  3. unity 常用插件 2

    Advanced PlayerPrefs Window 用来管理 PlayerPrefs 数据,超好用 JsonDotNet JSON 的序列化/反序列化插件.这个插件是支持 iOS, Android ...

  4. GUI、模块化与结对编程(homework-03)

    摘要: 在本次作业博客里,我将主要阐述作业3的收获.作业3表面是将之前的程序转换为图形界面(之前程序见http://www.cnblogs.com/shone/p/3348372.html),然而本质 ...

  5. Unity3D for VR 学习(6): 再次温故知新-3D数学

    一年前,系统学习过3D数学,并记录了一篇博客<C#程序员整理的Unity 3D笔记(十):Unity3D的位移.旋转的3D数学模型>. 一年后,再次温习之. 坐标系:Unity3D使用左手 ...

  6. vs2012 使用方法汇总

    1)安装Vsiual Assist插件 工具栏-->tools-->Extentsions and Upates-->点击左边的Online然后右边会出现可以安装的插件,找到Visu ...

  7. codebolocks 中文使用手册1.1

    Code::Blocks手册 使用篇 中文翻译版- 原手册下载:http://www.codeblocks.org/docs/manual_en.pdf 译者:JGood 译者言:工欲善其事,必先利其 ...

  8. enterprise architect (EA) 源码生成UML类图,帮助理解项目工程

    用VS看大型工程代码,尤其是很多层类的,很容易头晕,即便是装了visual assist 插件.用VS生成类图吧,只能生成一堆框,只有一些小的类关系有箭头表示.远远不能满足要求.下面介绍建模工具EA来 ...

  9. 使用Visual Studio扩展插件Visual assist X给代码插入注释模板

    Visual Assist 是由Whole Tomato公司为Microsoft Visual Studio开发的一款插件.它对Visual Studio的智能提示功能和代码高亮功能进行了增强,同时还 ...

随机推荐

  1. EWS API 2.0读取日历信息-读取内容注意事项

    采用模拟账号的方式读取日历信息,注意下日历的内容读取(Body)读取.代码如下:(采用 EWS API 2.0版本) 1.读取内容前必须设置如下属性:否则会提示:You must load or as ...

  2. firefox中flash经常崩溃

    建议: 1.安装flashblck插件 2.添加配置文件 在C:\Windows\SysWOW64\Macromed\Flash添加mmc.cfg. mmc.cfg的内容: SlientAutoUpd ...

  3. SharePoint 解决打开浏览器自动登录

    SharePoint使用Windows身份验证,默认会弹出Windows验证登录框,如下图所示: 1.对于已经加域的客户端 IE安全设置,将站点加信任站点,然后修改信任站点安全设置, 滚动条拉到最后, ...

  4. Atitti.java android反编译解决方案-----虚拟机方案

    Atitti.java android反编译解决方案-----虚拟机方案 哈哈,终极解决方案是虚拟机...c++也可以反编译为汇编代码,但无需担心,因为读懂汇编太麻烦..只要不能拿到c++源码就可.. ...

  5. xmpp整理笔记:用户网络连接及好友的管理

    xmpp中的用户连接模块包括用户的上线与下线信息展现,用户登录,用户的注册: 好友模块包括好友的添加,好友的删除,好友列表的展示. 在xmpp中 负责数据传输的类是xmppStream,开发的过程中, ...

  6. Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use.解决办法

    Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The ...

  7. Mac wifi已打开但尚未连接到网络

    把网络偏好设置  里面的询问新网络 关闭了   然后  重启电脑  试一下  应该就可以了

  8. java 语言规范 java language specifications

    在线地址: https://docs.oracle.com/javase/specs/ java语言规范下载: 链接:http://pan.baidu.com/s/1miEpJwk 密码:f89v j ...

  9. java重载和重写的区别

    一.重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现 ...

  10. Team Leader炖完石头汤后干嘛

    在万众创业的互联网年代,挖人组建全明星团队过于奢侈.面对水平参差不齐的团队咋办? 命运真是捉弄,半年前在大美团打工时准备做个NABC的教学项目 ,结果自己就被挖到"Competitors 竞 ...