自动生产代码


一、前言

由于之前写过关于UI框架的文章,这篇基于之前的基础,添加了自动生成代码的功能;

如果学习过程有困惑可以跳转到之前的文章《Unity——基于UGUI的UI框架》;

二、效果展示

三、将UIFrame打包成dll

我使用的是Rider编辑器,用其他的也可以;

目的就是将之前写好的UIFrame框架的几个公共类打包成dll供调用,只有打包成dll才可以在Plugins和Scripts文件夹中都能使用;

操作步骤如下:

1.创建新的classLibrary解决方案:

2.导入写好的类,目前只需要到这以下这三个类即可;

这几个类要添加统一的命名空间,只有在其他项目使用只需要using这个命名空间即可;

3.点击BuildSolution打包;

由于这几个类继承了MonoBehaviour,需要添加UnityEngine依赖,根据错误提示添加;

另外.Net的版本过高也会导致打包出错,修改一下版本即可;

四、自动生成代码

主要方法类UGUITool;由于是编辑器拓展功能,必须放在plugins文件夹下;

字段:

uiDirPath:所有面板加载路径;

classPath:自动生成的代码存放路径;

classTemp:自动化代码模板字符串;

方法:

CreateCode():核心方法;

思路:

1.根据面板加载路径,读取所有面板的prefab信息;

2.根据预制体的名称,自动生成@Init和@UIType部分的代码字符串;

3.字符串全部生成完成后替换对应部分,保存在存放路径;

注意:

我这里所有面板都是放在Resources中的,如果正式项目肯定不会Resources加载,所以需要做SteamingAssets路径判断;

代码部分:

public class UGUITool
{public static string uiDirPath = "Resources/Prefabs/UIPanel/";public static string classPath = "Scripts/UIFrame/UIManagerA.cs";private static string classTemp =@"using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;using UIFrame;public partial class UIManager : MonoSingle<UIManager>{private void InitPath(){dicPath = new Dictionary<string, string>();     //@Init}}public class UIType{//@UIType}
";[MenuItem("LittlePerilla/UGUI/CreateCode")]public static void CreateCode(){//Resources可以替换string path = Path.Combine(Application.dataPath, uiDirPath);Debug.Log("生成代码" + path);StringBuilder pt = new StringBuilder();StringBuilder tp = new StringBuilder();GameObject go = null;string[] fileList = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);int index = 0;string s = "Resources";foreach (var filePath in fileList){string newPath = string.Empty;newPath = filePath.Replace("\\", "/");if (newPath.Contains(s)){newPath = newPath.Substring(newPath.IndexOf(s) + s.Length + 1);newPath = newPath.Substring(0, newPath.IndexOf("."));go = Resources.Load<GameObject>(newPath);}else{//newPath = newPath.Substring(0, newPath.IndexOf("."));            //其他路径必须加后缀名go = AssetDatabase.LoadAssetAtPath<GameObject>(newPath) as GameObject;}if (go == null){Debug.LogError(newPath);continue;}if (go.GetComponent<UIBase>()){string name = go.name.ToLower();string uiName = $"UI{name.Substring(3, 1).ToUpper()}{name.Substring(4, name.Length-4)}";pt.AppendLine($"dicPath[\"{name}\"] = \"{newPath}\";");tp.AppendLine($"public const string {uiName} = \"{name}\";");index++;}}string codeClass = classTemp.Replace("//@Init", pt.ToString());codeClass = codeClass.Replace("//@UIType", tp.ToString());path = Path.Combine(Application.dataPath, classPath);File.WriteAllText(path, codeClass, Encoding.UTF8);Debug.Log($"{codeClass}生成完毕");AssetDatabase.Refresh();}
}

五、使用须知

路径必须设置正常,并且之后所有UI面板都必须放在对应的文件夹下才会自动生成对应的代码;

自动化代码是提高工作效率的重要手段,如果有修改意见请与作者联系;

Unity——自动化代码生成相关推荐

  1. Unity 自动化打包XCode工程

    Unity 自动化打包XCode工程 每次打包都要手动修改Xcode的各种配置,于是研究了一下通过Unity提供的API设置XCode的各种配置 XCode签名 在我使用的Unity版本中(Unity ...

  2. 使用iBatis的自动化代码生成工具Abator

    原来还不知道iBatis也有像Hibernate类似的自动化代码生成工具,今天找到Abator这工具也挺不错的,在ecelipse上面小试了一把: 1.获得Abator http://ibatis.a ...

  3. Unity 自动化1.0(代码,预制体生成到指定模块)

    代码生成参考的 知乎[Unity]工具类系列教程-- 代码自动化生成! - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/30716595 操作流程: 一,创建 ...

  4. 【编辑器】unity自动化生成UI模板代码

    前言 在游戏制作用,UI的代码架构是固定的.为了快速开发,只需要获得一个完整的UI结构代码,然后编写对应的业务逻辑即可.所以,自动化生成模板代码是一件必不可少的事情. 环境 UI的架构通常使用MVC的 ...

  5. Unity自动化打包脚本

    Unity的项目手动打包确实很痛苦,得慢慢等着,好无聊,能自动化脚本打包什么的最好了,闲话不多说直接上脚本. ` windows的bat脚本echo offset companyName=" ...

  6. Unity:自动化打包脚本

    Unity的项目手动打包确实很痛苦,得慢慢等着,好无聊,能自动化脚本打包什么的最好了,闲话不多说直接上脚本. ` windows的bat脚本echo offset companyName=" ...

  7. Unity自动化碰撞体生成方法-Normal Collider 和 碰撞体代理

    如何在Unity中对角色快速创建碰撞体(Normal Collider)和碰撞体代理(Fake Collider) 前言 快速给Humanoid人形角色添加碰撞体,使用Unity 的Collider系 ...

  8. python自动化代码生成_python 自动生成C++代码 (代码生成器)

    Python代码自动生成方法(代码生成器)遇到这种事在工作遇到问题,你需要写很多c++基础数据库类,但这些类是一样的,只不过是添加,删除,修改并检查.如果你手动编写代码,它是费力而容易出错;它可以很容 ...

  9. Unity自动化打包脚本设置

    代码如下: using UnityEditor; using UnityEngine;public class PackageTools {[MenuItem("Tools/PerformB ...

最新文章

  1. LTV 即用户生命周期价值
  2. php 加载一个文件路径_PHP文件加载过程
  3. 【匹配算法】渐进一致采样 PROSAC(PROgressive SAmple Consensus)
  4. CCNA-(9)-思科交换机特点
  5. docker,mysql,wordpress搭建个人博客
  6. centos7下载地址
  7. HDLBits答案(3)_Verilog模块的例化与调用
  8. C#LeetCode刷题之#496-下一个更大元素 I(Next Greater Element I)
  9. 什么是REST?以及RESTful的实现
  10. ios 企业证书 ipa 重新签名发布
  11. oracle 10g 扩表空间,Oracle 10g 表空间管理(一)
  12. python-excel-openpyxl读取数据---更新完善--1
  13. python语言中print函数的作用_[转载]python中的@符号的作用
  14. java 代码统计工具_java代码行数统计工具
  15. android开机自动打开微信小程序,Android应用启动微信小程序
  16. JAVA - 根据文件链接将文件下载保存到本地
  17. YGEV型系列电磁式明渠流速仪
  18. dw读取access中的图片_DreamWeaver入门必看:ACCESS数据库(三)
  19. 常用的前端还款计算器(包括按月等额本息、按四月等额本息、到期还本付息、到期还本按月付息四种还款方式)
  20. distinct 和order by 冲突解决方案

热门文章

  1. 创新案例分享 | 构建医院人力资源管理系统,赋能业务数据分析管理
  2. pip安装python包出错:Could not find a version that satisfies the requirement skimage (from versions: )...
  3. 淘宝主图视频怎么上传?怎么抓取、下载?
  4. MyBatis-Plus入门和使用实践
  5. HIT计统大作业:程序人生-hello’s P2P
  6. 不缺钱的钱荒背后究竟说明了啥?
  7. python脚本给微信好友自动发晚安消息
  8. 将IEEE参考文献导入Endnote的方法
  9. c++5806.传染病
  10. 查看穿山甲sdk版本号