Unity框架学习_编辑器自动生成UI代码_减少重复工作量,高效开发

 Unity框架学习_编辑器自动生成UI代码_减少重复工作量,高效开发


目录

1、博客介绍

2、内容

(1)生成演示

(2)生成结构

(3)逻辑结构

3、推送

4、结语


1、博客介绍

       所谓工欲善其事必先利其器,开发前写好相应的工具,后续的工作可以事半功倍,工作中在书写UI逻辑时,有很多重复和冗杂的内容,本篇博客介绍了在编辑器下一键生成UI相关的脚本。


2、内容

(1)生成演示

(2)生成结构

(3)逻辑结构

加载模板内容——>替换模板内容——>生成并写入文件

第一步:准备好三个模板类的脚本,分别对应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介绍文章,结尾有推送,我们把上述的内容稍加整理之后就可以达到开篇的演示效果了。


3、推送

本篇源码工程: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修饰符:


4、结语

       工欲善其事必先利其器,希望博主的文章对路过的同学能有所帮助,若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

       QQ交流群:806091680(Chinar)

       该群为CSDN博主Chinar所创,推荐一下!我也在群里!

       本文属于原创文章,转载请著名作者出处并置顶!!!!!

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值