博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Prefab Assist插件
阅读量:6708 次
发布时间:2019-06-25

本文共 2784 字,大约阅读时间需要 9 分钟。

资料

Prefab文档:

基础:基于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;/// /// 绑定在通用的背景Prefab上/// [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
(); 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
(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://ezilo.baihongyu.com/

你可能感兴趣的文章
互斥量和信号量的区别
查看>>
Csharp run sql script create database
查看>>
#pragma once 与 #ifndef 的区别解析
查看>>
How to check Ubuntu version
查看>>
qt 试用 (3)配置编译源代码及调试
查看>>
(转)用CSS3移除点击交互元素的高亮背景
查看>>
遍历json获得数据的几种方法
查看>>
php Collection类的设计
查看>>
c++中的计时器代码
查看>>
语义Web和本体开发相关技术
查看>>
Mysql集群读写分离(Amoeba)
查看>>
Quest for sane signals in Qt - step 1 (hand coding a Q_OBJECT)
查看>>
SpringBoot的注解:@SpringBootApplication注解 vs @EnableAutoConfiguration+@ComponentScan+@Configuration...
查看>>
SQL Server性能调优之执行计划深度剖析 第一节 浅析SQL执行的过程
查看>>
利用自定义IHttpModule来实现URL地址重写
查看>>
在网页上嵌入 PowerPoint 演示文稿
查看>>
javascript日期格式化函数,跟C#中的使用方法类似
查看>>
Android杂谈--Activity、Window、View的关系
查看>>
使用delphi 开发多层应用(十)安全访问服务器
查看>>
JavaScript计算字符串中每个字符出现的次数
查看>>