当前位置:   article > 正文

Unity框架学习_编辑器自动生成UI代码_减少重复工作量,高效开发_unity 根据内容自动生成ui界面

unity 根据内容自动生成ui界面

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


目录

1、博客介绍

2、内容

(1)生成演示

(2)生成结构

(3)逻辑结构

3、推送

4、结语


1、博客介绍

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


2、内容

(1)生成演示

(2)生成结构

(3)逻辑结构

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

第一步:准备好三个模板类的脚本,分别对应Model、View、Control,根据模板来生成脚本的内容若不太清楚请跳转博主上一篇博客,结尾有推送。模板内我们可以预先写好一些方法,在需要被替换的地方我们可以标注一下,比如在View脚本内我们将写入变量和变量的赋值,我们就预先写下了两个标记  /*声明*/   /*绑定*/。

第二步:将做好的页面制作成预设物

 

第三步:准备Editor脚本获取预设物信息

  1. [MenuItem("Assets/Create/Create UI Code")]
  2. public static void CreateUiCode()
  3. {
  4. //获取选中的Prefab
  5. var objs = Selection.GetFiltered(typeof(GameObject), SelectionMode.Assets | SelectionMode.TopLevel);
  6. for (var i = 0; i < objs.Length; i++)
  7. {
  8. Debug.Log(objs[i]);
  9. }
  10. }

编辑栏拓展不太清楚地可以自行百度谷歌,有很多介绍的文章,这里我们通过Editor的方法Selection.GetFiltered获取到我们选择的物体信息。

第四步:通过获取的物体信息,得到子物体内需要获取的组件

我们准备一个用来标记用的脚本UIType.cs,该组件我们挂载在需要获取的组件上

  1. using Extension;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. /// <summary>
  5. /// time:2019/6/2 13:57
  6. /// author:Sun
  7. /// des:UI类型
  8. ///
  9. /// github:https://github.com/KingSun5
  10. /// csdn:https://blog.csdn.net/Mr_Sun88
  11. /// </summary>
  12. public class UIType : MonoBehaviour
  13. {
  14. /// <summary>
  15. /// 变量名字
  16. /// </summary>
  17. private string VariableName
  18. {
  19. get { return "_"+gameObject.name.LowercaseFirst(); }
  20. }
  21. /// <summary>
  22. /// UI类型
  23. /// </summary>
  24. private string ComponentName
  25. {
  26. get
  27. {
  28. if (null != GetComponent<ScrollRect>())
  29. return "ScrollRect";
  30. if (null != GetComponent<InputField>())
  31. return "InputField";
  32. if (null != GetComponent<Button>())
  33. return "Button";
  34. if (null != GetComponent<Text>())
  35. return "Text";
  36. if (null != GetComponent<RawImage>())
  37. return "RawImage";
  38. if (null != GetComponent<Toggle>())
  39. return "Toggle";
  40. if (null != GetComponent<Slider>())
  41. return "Slider";
  42. if (null != GetComponent<Scrollbar>())
  43. return "Scrollbar";
  44. if (null != GetComponent<Image>())
  45. return "Image";
  46. if (null != GetComponent<ToggleGroup>())
  47. return "ToggleGroup";
  48. if (null != GetComponent<Animator>())
  49. return "Animator";
  50. if (null != GetComponent<Canvas>())
  51. return "Canvas";
  52. if (null != GetComponent<RectTransform>())
  53. return "RectTransform";
  54. return "Transform";
  55. }
  56. }
  57. /// <summary>
  58. /// 变量声明内容
  59. /// </summary>
  60. public string StatementContent
  61. {
  62. get { return "private"+" "+ ComponentName + " " + VariableName+";"; }
  63. }
  64. /// <summary>
  65. /// 变量绑定内容
  66. /// </summary>
  67. public string BindVariableContent
  68. {
  69. get
  70. {
  71. var content = VariableName + " = " + "GameObject.Find(\"" + gameObject.name + "\")";
  72. var bindProperty = "GetComponent<" + ComponentName + ">();";
  73. return content+"."+bindProperty;
  74. }
  75. }
  76. }

VariableName:声明属性时我们自定义的属性名字,LowercaseFirst()方法是静态拓展,不太清楚的同学跳转博主关于静态拓展的博客,结尾有推送。

ComponentName:get方法内我们定义了可以获取到该组件所属的UI组件的类型,并返回字符串。

StatementContent:字符串组合成完整的变量声明

BindVariableContent:字符串组合成完整的变量绑定内容

我们通过遍历获取的物体信息,就可以获取到子孙物体内的UIType从而获取到我们需要的信息

  1. [MenuItem("Assets/Create/Create UI Code")]
  2. public static void CreateUiCode()
  3. {
  4. //获取选中的Prefab
  5. var objs = Selection.GetFiltered(typeof(GameObject), SelectionMode.Assets | SelectionMode.TopLevel);
  6. for (var i = 0; i < objs.Length; i++)
  7. {
  8. var obj = objs[i] as GameObject;
  9. foreach (UIType child in obj.GetComponentsInChildren<UIType>(true))
  10. {
  11. Debug.Log(child.StatementContent);
  12. Debug.Log(child.BindVariableContent);
  13. }
  14. }
  15. }

第五步:整合

到这里就没什么东西了,我们已经可以获取到所有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所创,推荐一下!我也在群里!

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/115307
推荐阅读
相关标签
  

闽ICP备14008679号