Unity Editor编辑器扩展之创建脚本

前言

        既然你看到这篇文章了,你是否也有需要使用代码创建脚本的需求?使用编辑器扩展工具根据不同的表格或者新增的内容去创建你想要的脚本。如果不使用工具,那么你只能不断去修改某个脚本,这项工作既繁琐也浪费时间。这个时候作为程序员的我们就要自己写一个工具节省时间了,那么恰好unity editor可以帮助我们实现这个工具,接下来往下看👇

准备工作

        这里我打算用一个excel表格作为我需要经常更新内容。比如:我们在做本地登录时,有很多种错误码需要接入进来,但是这个错误码经常根据产品需求频繁的更新,手动改的话既繁琐又浪费时间还极容易改错,怎么解决呢?继续往下看👇

核心代码

        动态创建脚本就是这两个非常简单且经常使用的api,具体怎么使用,接着往下看👇

StringBuilder sb = new StringBuilder();
//写入文件
File.WriteAllText(filePath, fileContent);

        第一步:加载excel数据

/// <summary>
        /// 读取excel表格code码
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        static Dictionary<string, string> ReadExcelFile(string path)
        {
            Dictionary<string, string> datas = new Dictionary<string, string>();
            // StreamingAssets目录下的文件的路径
            FileStream fileStream = File.Open(path, FileMode.Open, FileAccess.Read);
            IExcelDataReader excelDataReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream);
            // 表格数据全部读取到result里
            DataSet result = excelDataReader.AsDataSet();
            // 获取表格有多少列 
            int colums = result.Tables[0].Columns.Count;
            // 获取表格有多少行
            int rows = result.Tables[0].Rows.Count;

            for (int i = 1; i < rows; i++)
            {
                if (string.IsNullOrEmpty(result.Tables[0].Rows[i][0].ToString())) continue;

                datas.Add(result.Tables[0].Rows[i][0].ToString(), result.Tables[0].Rows[i][1].ToString());
            }

            return datas;
        }

        第二步:格式化类内容

/// <summary>
        /// 生成静态类
        /// </summary>
        /// <param name="className"></param>
        /// <returns></returns>
        private static string GenerateStaticClassContent(string className)
        {
            var datas = ReadExcelFile(Application.streamingAssetsPath + "/UserMgrCode.xlsx");

            StringBuilder sb = new StringBuilder();

            sb.AppendLine("using System;");
            sb.AppendLine("");

            sb.AppendLine("public class CommonCode");
            sb.AppendLine("{");
            sb.AppendLine("    public int code;");
            sb.AppendLine("    public string value;");
            sb.AppendLine("}");
            sb.AppendLine("");

            sb.AppendLine("/// <summary>");
            sb.AppendLine("/// CodeEngine错误码管理引擎");
            sb.AppendLine("/// <summary>");
            sb.AppendLine("public static class " + className);
            sb.AppendLine("{");
            foreach (var item in datas)
            {
                sb.AppendLine("    /// <summary>");
                sb.AppendLine($"    /// 错误码{item.Key}");
                sb.AppendLine("    /// <summary>");
                sb.AppendLine("    public static CommonCode P_" + (item.Key) + "= new CommonCode(){code = " +
                              (item.Key) + $", value = \"{item.Value}\"}};");
                sb.AppendLine("");
            }

            sb.AppendLine("}");

            return sb.ToString();
        }

        第三步:写入文件,生成脚本

//写入文件
File.WriteAllText(filePath, fileContent);

结果

sing System;

public class CommonCode
{
    public int code;
    public string value;
}

/// <summary>
/// CodeEngine错误码管理引擎
/// <summary>
public static class CodeEngine
{
    /// <summary>
    /// 错误码401000
    /// <summary>
    public static CommonCode P_401000= new CommonCode(){code = 401000, value = "用户名或者密码为空,无法登录!"};

    /// <summary>
    /// 错误码401001
    /// <summary>
    public static CommonCode P_401001= new CommonCode(){code = 401001, value = "用户名不存在,请联系管理员!"};

    /// <summary>
    /// 错误码401002
    /// <summary>
    public static CommonCode P_401002= new CommonCode(){code = 401002, value = "密码错误,请重试!"};

    /// <summary>
    /// 错误码401003
    /// <summary>
    public static CommonCode P_401003= new CommonCode(){code = 401003, value = "输入不能为空,请重新输入!"};

    /// <summary>
    /// 错误码401004
    /// <summary>
    public static CommonCode P_401004= new CommonCode(){code = 401004, value = "用户名重复,请重新输入!"};

    /// <summary>
    /// 错误码401005
    /// <summary>
    public static CommonCode P_401005= new CommonCode(){code = 401005, value = "输入不能为空!"};

    /// <summary>
    /// 错误码401006
    /// <summary>
    public static CommonCode P_401006= new CommonCode(){code = 401006, value = "新密码不能为原始密码!"};

    /// <summary>
    /// 错误码401007
    /// <summary>
    public static CommonCode P_401007= new CommonCode(){code = 401007, value = "新密码和确认密码不一致,请重新输入!"};

    /// <summary>
    /// 错误码401008
    /// <summary>
    public static CommonCode P_401008= new CommonCode(){code = 401008, value = "新设置的密码长度不符合要求,请重新输入!"};

    /// <summary>
    /// 错误码401009
    /// <summary>
    public static CommonCode P_401009= new CommonCode(){code = 401009, value = "密码包含特殊字符,请重新输入!"};

    /// <summary>
    /// 错误码401010
    /// <summary>
    public static CommonCode P_401010= new CommonCode(){code = 401010, value = "用户添加失败!"};

}

Editor使用方法

        [MenuItem("模拟维修/生成LoginCode码")]
        public static void CreateUserCode()
        {
            string className = "CodeEngine";
            string filePath = $"Assets/Scripts/SimulateEngine/{className}.cs";
            string fileContent = GenerateStaticClassContent(className);

            //创建目录
            Directory.CreateDirectory(Path.GetDirectoryName(filePath));

            //写入文件
            File.WriteAllText(filePath, fileContent);

            //刷新编辑器
            AssetDatabase.Refresh();
        }

Editor编辑器扩展之创建脚本ok了,点下赞和关注,就赶紧去试试吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/560969.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯第十五界软件测试线下省赛题目分析及解决

PS 需要第十五界蓝桥杯被测系统或者功能测试模板、单元测试被测代码、自动化测试被测代码请加&#x1f427;:1940787338 备注&#xff1a;15界蓝桥杯省赛软件测试 题目1&#xff1a;功能测试 题目描述 ​ 某物流公司的货运收费标准根据重量、距离和节假日三个因素来确定。如…

【介绍下LeetCode的使用方法】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

1.为什么选择Vue框架

参考&#xff1a;百战程序员 为什么选择Vue框架 Vue是什么&#xff1f; 渐进式 JavaScript 框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用场景丰富的 Web 前端框架 为什么要学习Vue Vue是目前前端最火的框架之一Vue是目前企业技术栈中要求的知识点Vue可以…

Lesson4--栈和队列

【本节目标】 1.栈 2.队列 3.栈和队列面试题 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO &…

vue快速入门(三十五)组件通信-父传子

注释很详细&#xff0c;直接上代码 上一篇 新增内容 父组件传值子组件接收父组件传来的数据 源码 App.vue <template><div id"app"><!-- :item"item"为将item的值传递给MyTest组件 --><MyTest v-for"item in roles" :key&q…

【双曲几何】圆盘上的三角形概念

目录 一、说明二、对偶三角形概念2.1 反演关系2.2 对偶关系2.3 找出三角形的对偶三角形 三、正交三角形概念3.1 通过对偶三角形&#xff0c;找到垂心3.2 正交三角形的概念3.3 中心射影点的概念 四、后记 一、说明 本文对双曲空间的三角形进行分析&#xff0c;本篇首先给出&am…

(vue)el-select选择框加全选/清空/反选

(vue)el-select选择框加全选/清空/反选 <el-form-item label"批次"><el-selectv-model"formInline.processBatch"multiplecollapse-tagsfilterableplaceholder"请选择"style"width: 250px"no-data-text"请先选择企业、日…

基于docker的开发者集成环境

docker-compose一键部署开发者环境。 常见的中间件&#xff1a;nginx, mysql, redis, mongo, rabbitmq, nacos, rocketmq, zookeeper等。 GIthub项目地址 1. 下载项目&#xff1a;git clone https://github.com/xhga/docker-develop-env.git 2. 进入文件夹&#xff1a;cd d…

实例分割——苹果数据集

一、重要性及意义 重要性&#xff1a; 提升农业生产效率&#xff1a;通过自动化检测和分割技术&#xff0c;可以快速准确地识别出图像中的苹果&#xff0c;进而实现自动化的采摘、计数和品质评估。这极大地提高了农业生产的效率&#xff0c;减少了人工劳动成本。 优化资源配置…

【网站项目】高校毕业论文管理系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

力扣:LCR 022. 环形链表 II

力扣&#xff1a;LCR 022. 环形链表 II 给定一个链表&#xff0c;返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环&#xff0c;则返回 null。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链…

为了机器学习量化策略,我标注了两万条数据

题图&#xff1a;芝加哥大学海德公园。芝大是经济学重镇&#xff0c;其学者开创了著名的芝加哥经济学派&#xff0c;共产生了 100 位诺奖、10 位菲尔兹奖、4 位图灵奖。今天量化人追逐的 Alpha&#xff0c; 最早就来自于 Michael Jessen 在芝大时的博士论文。 很多人对基于机器…

Git - 在PyCharm/Idea中集成使用Git

文章目录 Git - 在PyCharm/Idea中集成使用Git1.新建GitHub仓库2.将仓库与项目绑定3.在PyCharm中使用Git4.新建Gitee仓库5.将仓库与项目绑定6.在IDEA中使用Git Git - 在PyCharm/Idea中集成使用Git 本文详细讲解了如何在 PyCharm 或 Idea 中配置 Gitee 或 GitHub 仓库&#xff0…

稀碎从零算法笔记Day53-LeetCode:不同路径 II

稀碎系列有点更不动(更多是自己懈怠了) 题型&#xff1a;矩阵、模拟 链接&#xff1a;63. 不同路径 II - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &…

DQ-DETR: DETR WITH DYNAMIC QUERY FOR TINY OBJECTDETECTION 学习笔记

论文地址&#xff1a;https://arxiv.org/pdf/2404.03507.pdf 此DQ-DETR与IDEA提出的同名&#xff0c;该文主要集中于小目标的检测 尽管之前的类似DETR的方法在通用目标检测中取得了成功&#xff0c;但在小目标检测方面仍然具有挑战性&#xff0c;因为目标 Query 的位置信息并未…

软件开发中的“左移”是什么意思?

我曾经有过一个经理&#xff0c;在讨论我们的项目时提到&#xff0c;我们需要尽可能地将我们的工作左移。 几个月后&#xff0c;在一次面试中&#xff0c;面试官问我是否知道“左移”是什么意思。 除非有人没告诉我一个秘密的软件舞蹈&#xff0c;我现在就来告诉你左移是什么…

iview中基于upload源代码组件封装更为完善的上传组件

业务背景 最近接了一个用iview为基础搭建的vue项目&#xff0c;在开需求研讨会议的时候&#xff0c;我个人提了一个柑橘很合理且很常规的建议&#xff0c;upload上传文件支持同时上传多个并且可限制数量。当时想的是这不应该很正常吗&#xff0c;但是尴尬的是&#xff1a;只有…

YZ系列工具之YZ10:VBA_梦幻图像

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…

一分钟成为点灯大师(超简单1行代码-STM32F407的HAL实现按键中断方式点亮LED灯)

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 使用STM32F407的HAL库实现按键中断方式读取按键…

HCF-Net:用于红外小目标检测的分层上下文融合网络

摘要 红外小目标检测是一项重要的计算机视觉任务&#xff0c;涉及在红外图像中识别和定位微小物体&#xff0c;这些物体通常仅包含几个像素。然而&#xff0c;由于物体尺寸极小以及红外图像中通常复杂的背景&#xff0c;这项任务面临困难。在本文中&#xff0c;我们提出了一种…