自动化代码生成


一.前言

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

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

二.效果展示

三.打包UIFrame

我使用的是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命令行模式,也能「日志实时输出」

    转自自己的简书:http://www.jianshu.com/p/bd97cb8042a9 如果你使用过Unity命令行模式(batchmode),来实现Unity自动化编译构建,你肯定会遇到过这样的 ...

  2. unity项目警告之 LF CRLF问题

    unity中创建的脚本,以LF结尾. Visual studio中创建的脚本,以 CRLF结尾. 当我们创建一个unity脚本后,再用VS打开编辑保存后,这个文件既有LF结尾符,也有CRLF结尾符. ...

  3. Dataphin的代码自动化能力如何助力商业决策

    前言 随着大数据趋势的迅速增长,数据的重要性与日俱增,企业内看数据.用数据的诉求越来越强烈,其中最常见的就是各种经营报表数据:老板每日早晨9点准时需要看到企业核心的经营数据,以便进行企业战略及方向决策 ...

  4. Apworks框架实战(五):EasyMemo的领域模型设计

    在上一讲中,我们已经新建了一个聚合根对象Account,并已经可以开始设计领域模型了.在这一讲中,我们会着重介绍EasyMemo领域模型的分析和设计,并引入Visual Studio Ultimate ...

  5. CloudNotes之领域建模篇:领域模型简介

    CloudNotes领域模型还是相对简单的,并不一定需要采用面向领域驱动的设计方法来解决CloudNotes的领域问题.但出于以下几个方面的原因,我还是采用了面向领域驱动的方式来开发CloudNote ...

  6. 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)

    本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...

  7. 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)

    前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modeling SDK进行领域特定语言(DSL)的开发,包括两个部分的内容.在第一部分中,将对 ...

  8. excel查看VBA代码快捷键

    公司现在的很多自动化代码生成使用excel VBA,本来这事跟自己一点关系打不着,不过计划年底切换中间件,这得导致部分代码结构调整,自己还得去调整测试,老忘掉这快捷键,特记录下,Alt + F11

  9. Atitit.研发管理--提升效率--软件开发方法DSM总结o99

    Atitit.研发管理--提升效率--软件开发方法DSM总结o99 1. 什么是DSM? 1 2. DSM使用的语言DSL 2 3. 模型的优点 2 4. DSM 跟与MDA区别 2 5. MDA的实 ...

随机推荐

  1. 两种方式配置vue全局方法

    目录 1,前言 2,第一种方式 3,第二种方式 1,前言 在Vue项目开发中,肯定会有这样一个场景:在不同的组件页面用到同样的方法,比如格式化时间,文件下载,对象深拷贝,返回数据类型,复制文本等等.这 ...

  2. python库--tensorflow--可视化

    方法 返回值类型 参数 说明 tf.summary .FileWrite()   创建事件文件     logdir 文件保存路径(C盘), 通过tensorboard --logdir=文件路径(l ...

  3. 【第十一篇】- Git Gitee之Spring Cloud直播商城 b2b2c电子商务技术总结

    Git Gitee 大家都知道国内访问 Github 速度比较慢,很影响我们的使用. 如果你希望体验到 Git 飞一般的速度,可以使用国内的 Git 托管服务--Gitee(gitee.com). G ...

  4. Markdown快捷键详解(源自狂神说Java视频,整理版)

    #加空格 表示是一个标题(一级标题)回车后直接生成 例下 Markdown学习 标题: ##(两个#号)空格加标题名字即为二级标题例下 二级标题 三个#号 加标题名字即为三级标题,与二级标题等有层级关 ...

  5. rune和byte在处理字符/字符串中的应用.

    rune和byte在处理字符/字符串中的应用. 定义: rune是int32的别名,-2147483648->2147483647,常用来表示UNICODE字符集,可以用来处理包含中文/非中文的 ...

  6. 使用vsCode开发vue项目格式化通用配置

    {   "editor.tabSize": 2,   "editor.fontSize": 18,   "editor.wordWrap": ...

  7. Linux系列(35) - 光盘yum源搭建(2)

    光盘搭建yum源 背景 当前Linux服务器没有网络,yum源下载好了,在光盘中 step-01 挂载光盘 mkdir /mnt/cdrom #建立挂载点 mount /dev/cdrom /mnt/ ...

  8. springboot 运行出现错误 Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

    原因是我将springboot启动类换到了另外一个方法中 出现了一个异常 后来发现因为我换了类但是忘记了换类名所以才报错 @ComponentScan @EnableAutoConfiguration ...

  9. 自己写登陆验证及借用auth的is_authenticated验证是否登陆

    一. 自己写登陆需要注册,一个session的处理,还有一个session的删除 #自定义一个闭包装饰器,来验证def checkLogin(func): def wrapper(request, * ...

  10. cgroup之cpu关键参数

    cpu.cfs_period_us specifies a period of time in microseconds (µs, represented here as "us" ...