Unity——自动化代码生成
自动化代码生成
一.前言
由于之前写过关于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——自动化代码生成的更多相关文章
- Unity命令行模式,也能「日志实时输出」
转自自己的简书:http://www.jianshu.com/p/bd97cb8042a9 如果你使用过Unity命令行模式(batchmode),来实现Unity自动化编译构建,你肯定会遇到过这样的 ...
- unity项目警告之 LF CRLF问题
unity中创建的脚本,以LF结尾. Visual studio中创建的脚本,以 CRLF结尾. 当我们创建一个unity脚本后,再用VS打开编辑保存后,这个文件既有LF结尾符,也有CRLF结尾符. ...
- Dataphin的代码自动化能力如何助力商业决策
前言 随着大数据趋势的迅速增长,数据的重要性与日俱增,企业内看数据.用数据的诉求越来越强烈,其中最常见的就是各种经营报表数据:老板每日早晨9点准时需要看到企业核心的经营数据,以便进行企业战略及方向决策 ...
- Apworks框架实战(五):EasyMemo的领域模型设计
在上一讲中,我们已经新建了一个聚合根对象Account,并已经可以开始设计领域模型了.在这一讲中,我们会着重介绍EasyMemo领域模型的分析和设计,并引入Visual Studio Ultimate ...
- CloudNotes之领域建模篇:领域模型简介
CloudNotes领域模型还是相对简单的,并不一定需要采用面向领域驱动的设计方法来解决CloudNotes的领域问题.但出于以下几个方面的原因,我还是采用了面向领域驱动的方式来开发CloudNote ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)
本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)
前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modeling SDK进行领域特定语言(DSL)的开发,包括两个部分的内容.在第一部分中,将对 ...
- excel查看VBA代码快捷键
公司现在的很多自动化代码生成使用excel VBA,本来这事跟自己一点关系打不着,不过计划年底切换中间件,这得导致部分代码结构调整,自己还得去调整测试,老忘掉这快捷键,特记录下,Alt + F11
- Atitit.研发管理--提升效率--软件开发方法DSM总结o99
Atitit.研发管理--提升效率--软件开发方法DSM总结o99 1. 什么是DSM? 1 2. DSM使用的语言DSL 2 3. 模型的优点 2 4. DSM 跟与MDA区别 2 5. MDA的实 ...
随机推荐
- Python - pip-review 库
使用 pip-review 库(推荐) 安装库 pip install pip-review 检查是否有需要更新的包 > pip-review scikit-learn==0.23.2 is a ...
- ICCV2021 | MicroNet:以极低的 FLOPs 改进图像识别
前言:这篇论文旨在以极低的计算成本解决性能大幅下降的问题.提出了微分解卷积,将卷积矩阵分解为低秩矩阵,将稀疏连接整合到卷积中.提出了一个新的动态激活函数-- Dynamic Shift Max,通过 ...
- Golang入门学习(二):控制分支
文章目录 @[TOC] 1. 控制分支 1.1 if-else分支 1.2 switch分支 1.4 while 和do...while循环结构 1.5 多种循环结构 1.6 break 1.7 co ...
- vue el-transfer新增拖拽排序功能---sortablejs插件
<template> <!-- target-order="unshift"必须设置,如果不设置的话后台穿的value值得顺序会被data重置 - --> ...
- 剑指 Offer 60. n个骰子的点数
剑指 Offer 60. n个骰子的点数 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n ...
- vue-cli3 创建多页面应用项目
1.创建vue项目 cmd命令执行 vue create ruc-continuing 创建vue项目,项目名称:ruc-continuing 选择一个 preset(预置项),或自定义: 选择自 ...
- 腾讯云 CIF 工程效能峰会,10 月 19 - 20 日震撼来袭!
近年来,依托于云计算的飞速发展,腾讯云云产品更新迅猛,云原生生态构建初具规模,越来越多的企业也开始寻求与深入数字化转型之路.但在摸索与实践中,企业往往会进入"伪上云"的误区.除了单 ...
- SpringBoot 如何进行对象复制,老鸟们都这么玩的!
大家好,我是飘渺. 今天带来SpringBoot老鸟系列的第四篇,来聊聊在日常开发中如何优雅的实现对象复制. 首先我们看看为什么需要对象复制? 为什么需要对象复制 如上,是我们平时开发中最常见的三层M ...
- 全面分析 Vue 的 computed 和 watch 的区别
一.computed介绍 computed 用来监控自己定义的变量,该变量在 data 内没有声明,直接在 computed 里面定义,页面上可直接使用. //基础使用 {{msg}} <inp ...
- Java线程类
基础知识 线程状态 根据Thread.State类中的描述,Java中线程有六种状态:NEW,RUNNABLE,WAITING,TERMINATED,BLOCKED. 就绪状态(NEW):当线程对象调 ...