资料

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. BASIS--笨办法解决ALV_GRID的列剪切丢失纪录的错误

    最近经常有业务人员问及在ALV_grid输出报表中,选择某一列,点击左键,并点击弹出菜单的复制文本,复制出的文本存在丢失 (纪录不少,但部分纪录的文本丢失).该如何解决呢? 后来跟踪代码发现这个命令没 ...

  2. spring-hellow word

          在大三的时候开了一门JAVAEE SSH框架,属于软件方向选修课程,虽然本人是搞硬件的,但是也选了这么课程,因为我在想有一天物联网也会走上大门户的,所以果断去蹭课了,时至今日,重新拾起来, ...

  3. Android提交数据到JavaWeb服务器实现登录

    之前学习Android提交数据到php服务器没有成功,在看了两三个星期的视频之后,现在终于实现了与服务器的交互.虽然完成的不是PHP端的,但是在这个过程还是学到了不少东西的.现在我先来展示一下我的成果 ...

  4. iOS 开发之路(登陆验证调用WebService)二

    swift3.0下使用Alamofire调用Webservice遇到的一些问题以及解决方案. 首先是针对没有证书的https下的接口处理问题(ps:不推荐在正式版本中使用),manager.reque ...

  5. App开发流程之使用分类(Category)和忽略编译警告(Warning)

    Category使得开发过程中,减少了继承的使用,避免子类层级的膨胀.合理使用,可以在不侵入原类代码的基础上,写出漂亮的扩展内容.我更习惯称之为"分类". Category和Ext ...

  6. 安卓学习-- RecyclerView简单入门

    一.加入JAR包 第一感觉这个东东,好复杂,没ListView来的快,方便 在项目中加入android-support-v7-recyclerview.jar包 这个包在extras\android\ ...

  7. ios 返回指定导航控制器

    UINavigationController *navigationVC = self.navigationController; NSMutableArray *viewControllers = ...

  8. PHP将uncode转utf8,一行代码解决问题

    在很多场合能看到unicode编码过的文字,如“\u6d3b\u52a8\u63a5\u53e3”,虽然程序会认识,但人眼无法阅读,很不方便,网络上很多人写了很多的转换函数,但是一个比一个臃肿,终于发 ...

  9. DOM属性操作

    HTML attribute  --> DOM property 每个html属性都对应一个DOM对象属性,举个栗子: <div> <label for="userN ...

  10. HTML5 respond.js 解决IE6~8的响应式布局问题

    HTML5 respond.js 解决IE6~8的响应式布局问题   响 应式布局,理想状态是,对PC/移动各种终端进行响应.媒体查询的支持程度是IE9+以及其他现代的浏览器,但是IE8在市场当中仍然 ...