转载自:https://zhuanlan.zhihu.com/p/30716595?utm_medium=social&utm_source=qq
【为什么要做自动化工具】
工具类的创建是为了解决实际问题或者优化既有流程,我们来先看看一些项目里面经常遇到的问题。
程序代码有很多时候类是相似的,因此新建一个功能的时候你会直接复制了之前"相似"的代码块,然后删除掉无用的逻辑功能,但是有时候会出现漏网之鱼。
开完会,策划发过来一个功能案子,UI相关的界面非常的多,你费劲拼完了UI,写脚本类的时候将你用到的一些组件一个一个写了函数变量加进脚本中去,有时候一运行发现报错,结果是有一个函数没有赋值,要么是有一个按钮没有生成变量,创建到调试中间花费大量时间精力。
功能做完了,按理来说你应该放松下来喝一杯咖啡,但是你一更新发现UI预制体的红色冲突警告心直接凉了半截,解决预制体冲突后,又一遍一遍的将丢失的引用赋值到脚本上。
如果计算机能帮我们直接创建一个功能的基础脚本类,就不用每次去复制上次的代码了。然后再帮我们把那些乱七八糟又数不胜数的按钮、文字、图片组件都自动生成在脚本里面,然后自己去关联好引用,一下就能节省好多重复的活。
效果展示
【相关功能实现与解析】
完整的脚本:
using UnityEngine;
using UnityEditor; using System.Linq; using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; using System.Text; public class AutoBuildTemplate { public static string UIClass = @"using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System; public class #类名# : MonoBehaviour { //auto public void Start() { #查找# } #成员# } "; } public class AutoBuild { [MenuItem("生成/创建或刷新界面")] public static void BuildUIScript() { var dicUIType = new Dictionary<string, string>(); dicUIType.Add("Img", "Image"); dicUIType.Add("Btn", "Button"); dicUIType.Add("Txt", "Text"); dicUIType.Add("Tran", "Transform"); GameObject[] selectobjs = Selection.gameObjects; foreach (GameObject go in selectobjs) { //选择的物体 GameObject selectobj = go.transform.root.gameObject; //物体的子物体 Transform[] _transforms = selectobj.GetComponentsInChildren<Transform>(true); List<Transform> childList = new List<Transform>(_transforms); //UI需要查询的物体 var mainNode = from trans in childList where trans.name.Contains('_') && dicUIType.Keys.Contains(trans.name.Split('_')[0]) select trans; var nodePathList = new Dictionary<string, string>(); //循环得到物体路径 foreach (Transform node in mainNode) { Transform tempNode = node; string nodePath = "/" + tempNode.name; while (tempNode != tempNode.root) { tempNode = tempNode.parent; int index = nodePath.