Prefab Assist插件
本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/4519242.html
资料#
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 = 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都放在统一的目录下
[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小工具,可以很方便的实现批量修改,提高工作效率。
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验