赞
踩
所谓工欲善其事必先利其器,开发前写好相应的工具,后续的工作可以事半功倍,工作中在书写UI逻辑时,有很多重复和冗杂的内容,本篇博客介绍了在编辑器下一键生成UI相关的脚本。
加载模板内容——>替换模板内容——>生成并写入文件
第一步:准备好三个模板类的脚本,分别对应Model、View、Control,根据模板来生成脚本的内容若不太清楚请跳转博主上一篇博客,结尾有推送。模板内我们可以预先写好一些方法,在需要被替换的地方我们可以标注一下,比如在View脚本内我们将写入变量和变量的赋值,我们就预先写下了两个标记 /*声明*/ /*绑定*/。
第二步:将做好的页面制作成预设物
第三步:准备Editor脚本获取预设物信息
- [MenuItem("Assets/Create/Create UI Code")]
- public static void CreateUiCode()
- {
- //获取选中的Prefab
- var objs = Selection.GetFiltered(typeof(GameObject), SelectionMode.Assets | SelectionMode.TopLevel);
- for (var i = 0; i < objs.Length; i++)
- {
- Debug.Log(objs[i]);
- }
- }
编辑栏拓展不太清楚地可以自行百度谷歌,有很多介绍的文章,这里我们通过Editor的方法Selection.GetFiltered获取到我们选择的物体信息。
第四步:通过获取的物体信息,得到子物体内需要获取的组件
我们准备一个用来标记用的脚本UIType.cs,该组件我们挂载在需要获取的组件上
- using Extension;
- using UnityEngine;
- using UnityEngine.UI;
-
- /// <summary>
- /// time:2019/6/2 13:57
- /// author:Sun
- /// des:UI类型
- ///
- /// github:https://github.com/KingSun5
- /// csdn:https://blog.csdn.net/Mr_Sun88
- /// </summary>
- public class UIType : MonoBehaviour
- {
-
- /// <summary>
- /// 变量名字
- /// </summary>
- private string VariableName
- {
- get { return "_"+gameObject.name.LowercaseFirst(); }
- }
-
- /// <summary>
- /// UI类型
- /// </summary>
- private string ComponentName
- {
- get
- {
- if (null != GetComponent<ScrollRect>())
- return "ScrollRect";
- if (null != GetComponent<InputField>())
- return "InputField";
- if (null != GetComponent<Button>())
- return "Button";
- if (null != GetComponent<Text>())
- return "Text";
- if (null != GetComponent<RawImage>())
- return "RawImage";
- if (null != GetComponent<Toggle>())
- return "Toggle";
- if (null != GetComponent<Slider>())
- return "Slider";
- if (null != GetComponent<Scrollbar>())
- return "Scrollbar";
- if (null != GetComponent<Image>())
- return "Image";
- if (null != GetComponent<ToggleGroup>())
- return "ToggleGroup";
- if (null != GetComponent<Animator>())
- return "Animator";
- if (null != GetComponent<Canvas>())
- return "Canvas";
- if (null != GetComponent<RectTransform>())
- return "RectTransform";
-
- return "Transform";
- }
- }
-
- /// <summary>
- /// 变量声明内容
- /// </summary>
- public string StatementContent
- {
- get { return "private"+" "+ ComponentName + " " + VariableName+";"; }
- }
-
- /// <summary>
- /// 变量绑定内容
- /// </summary>
- public string BindVariableContent
- {
- get
- {
- var content = VariableName + " = " + "GameObject.Find(\"" + gameObject.name + "\")";
- var bindProperty = "GetComponent<" + ComponentName + ">();";
- return content+"."+bindProperty;
- }
- }
-
- }
VariableName:声明属性时我们自定义的属性名字,LowercaseFirst()方法是静态拓展,不太清楚的同学跳转博主关于静态拓展的博客,结尾有推送。
ComponentName:get方法内我们定义了可以获取到该组件所属的UI组件的类型,并返回字符串。
StatementContent:字符串组合成完整的变量声明
BindVariableContent:字符串组合成完整的变量绑定内容
我们通过遍历获取的物体信息,就可以获取到子孙物体内的UIType从而获取到我们需要的信息
- [MenuItem("Assets/Create/Create UI Code")]
- public static void CreateUiCode()
- {
- //获取选中的Prefab
- var objs = Selection.GetFiltered(typeof(GameObject), SelectionMode.Assets | SelectionMode.TopLevel);
-
- for (var i = 0; i < objs.Length; i++)
- {
- var obj = objs[i] as GameObject;
- foreach (UIType child in obj.GetComponentsInChildren<UIType>(true))
- {
- Debug.Log(child.StatementContent);
- Debug.Log(child.BindVariableContent);
- }
- }
- }
第五步:整合
到这里就没什么东西了,我们已经可以获取到所有UI信息,我们只需要将模板内的标记替换为我们整理好的信息就好了
fileContent.Replace("/*声明*/", statementContent.ToString()).Replace("/*绑定*/", bindVariableContent.ToString());
这里提一点,博主在准备模板的时候用了修饰符partial,很有意思的一个东西,对该修饰符不太清楚地同学可以跳转博主的partial介绍文章,结尾有推送,我们把上述的内容稍加整理之后就可以达到开篇的演示效果了。
本篇源码工程:https://github.com/KingSun5/Study_UICodeCreate
模板生成代码: https://blog.csdn.net/Mr_Sun88/article/details/90681777
静态拓展:https://blog.csdn.net/Mr_Sun88/article/details/90106925
partial修饰符:
工欲善其事必先利其器,希望博主的文章对路过的同学能有所帮助,若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。
QQ交流群:806091680(Chinar)
该群为CSDN博主Chinar所创,推荐一下!我也在群里!
本文属于原创文章,转载请著名作者出处并置顶!!!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。