Unity 通过配置文件生成代码

文章目录

      • 示例1:基于ScriptableObject的配置生成类
      • 示例2:预制体路径列表生成加载代码
      • 示例3:动画剪辑生成动画控制器片段
      • 示例4:Excel配置表生成序列化类
      • 示例5:UI元素及其事件绑定生成代码

在Unity编辑器模式下,根据配置文件动态生成代码可以通过编写自定义编辑器脚本实现。以下是一些场景下的5个简化示例,分别说明如何基于不同的配置数据来生成对应的C#代码:

示例1:基于ScriptableObject的配置生成类

using UnityEngine;
using UnityEditor;
using System.IO;[CreateAssetMenu(fileName = "NewConfig.asset", menuName = "Configuration/New Config")]
public class ConfigurationSO : ScriptableObject
{public string[] GameObjectNames;[MenuItem("Assets/Generate Code From Config")]static void GenerateCode(){var config = Selection.activeObject as ConfigurationSO;if (config != null){StringBuilder sb = new StringBuilder();foreach (var name in config.GameObjectNames){sb.AppendLine($"public GameObject {name};");}string className = "GeneratedConfig";string filePath = Path.Combine(Application.dataPath, $"Scripts/{className}.cs");File.WriteAllText(filePath, $@"
using UnityEngine;public class {className}
{{{sb.ToString()}
}}
");AssetDatabase.Refresh();}else{Debug.LogError("Please select a ConfigurationSO asset.");}}
}

这个例子中,我们创建了一个ScriptableObject类型ConfigurationSO,其中包含一个字符串数组用于存储游戏对象名称。当用户通过菜单命令“Assets/Generate Code From Config”执行时,会根据这些名称动态生成一个新的C#类,该类包含了与配置中每个名称相对应的游戏对象字段。

示例2:预制体路径列表生成加载代码

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.IO;public class PrefabLoaderGenerator : Editor
{[MenuItem("Assets/Generate Prefab Loader")]static void GeneratePrefabLoader(){var prefabPaths = new List<string>();foreach (var guid in Selection.assetGUIDs){var path = AssetDatabase.GUIDToAssetPath(guid);if (PrefabUtility.GetPrefabAssetType(AssetDatabase.LoadMainAssetAtPath(path)) == PrefabAssetType.Regular){prefabPaths.Add(path);}}if (prefabPaths.Count > 0){StringBuilder sb = new StringBuilder();for (int i = 0; i < prefabPaths.Count; i++){var name = Path.GetFileNameWithoutExtension(prefabPaths[i]);sb.AppendLine($"public GameObject {name}Prefab {{ get {{ return Resources.Load(\"{prefabPaths[i]}\") as GameObject; }} }}");}string className = "PrefabLoader";string filePath = Path.Combine(Application.dataPath, $"Scripts/{className}.cs");File.WriteAllText(filePath, $@"
using UnityEngine;public static class {className}
{{{sb.ToString()}
}}
");AssetDatabase.Refresh();}else{Debug.LogError("Please select one or more prefabs.");}}
}

此例中,选择多个预制体后,编辑器将生成一个静态类,其成员为对应预制体路径的属性,并且返回从Resources目录加载的预制体引用。

示例3:动画剪辑生成动画控制器片段

using UnityEngine;
using UnityEditor;
using UnityEngine.Animations.Rigging;
using System.Linq;public class AnimationClipControllerGenerator : EditorWindow
{[MenuItem("Assets/Generate Animation Controller")]static void GenerateController(){var clips = Selection.objects.OfType<AnimationClip>().ToList();if (clips.Any()){AnimatorController ac = new AnimatorController();ac.name = "GeneratedAnimatorController";foreach (var clip in clips){var stateMachine = ac.layers[0].stateMachine;var newState = stateMachine.AddStateMachineBehaviour(typeof(Playables.PlayableState));newState.motion = clip;newState.name = clip.name;}string controllerPath = AssetDatabase.GenerateUniqueAssetPath("Assets/_Generated/GeneratedAnimatorController.controller");AssetDatabase.CreateAsset(ac, controllerPath);// 这里是假设要生成控制代码,但实际AnimatorController不需要额外C#代码控制// 若需要,可以写入如切换动画状态的函数代码到指定文件}else{Debug.LogError("Please select one or more animation clips.");}}
}

虽然这个例子并不直接生成C#代码,而是动态地构建了AnimatorController层级结构(Unity内置功能),若需生成相关C#控制代码,则可进一步扩展以根据生成的状态机结构创建相应的C#方法调用逻辑。

示例4:Excel配置表生成序列化类

// 假设我们有一个工具能够读取Excel并转换成TSV格式文本
public class ExcelToCSClassGenerator : Editor
{[MenuItem("Assets/Generate C# Class from Excel")]static void GenerateClassFromExcel(){// 省略了读取和解析Excel的过程,假设已得到键值对集合Dictionary<string, string> tableData = ReadExcelDataAsDictionary("SettingSrc/Test.xls");StringBuilder sb = new StringBuilder();sb.AppendLine("using UnityEngine;");sb.AppendLine("[System.Serializable]");sb.AppendLine("public class ExcelConfig {");foreach (var pair in tableData){sb.AppendLine($"    public string {pair.Key} {{ get; set; }} = \"{pair.Value}\";");}sb.Append("}");string className = "ExcelConfig";string filePath = Path.Combine(Application.dataPath, $"Scripts/{className}.cs");File.WriteAllText(filePath, sb.ToString());AssetDatabase.Refresh();}static Dictionary<string, string> ReadExcelDataAsDictionary(string excelPath) {// 实现从Excel文件读取数据到字典的方法// 这里省略了具体实现细节return new Dictionary<string, string>(); // 返回样本空字典,实际应填充数据}
}

这里展示了如何根据Excel表格中的键值对生成一个带有属性的C#类,类中属性与Excel表头一一对应。

示例5:UI元素及其事件绑定生成代码

using UnityEngine.UIElements;
using UnityEditor.UIElements;
using UnityEditor;
using System.Linq;public class UIElementCodeGenerator : EditorWindow
{[MenuItem("UI/Generate UI Bindings")]static void GenerateUIBindings(){VisualElement root = GetActiveUIRootElement();if (root != null){StringBuilder sb = new StringBuilder();foreach (VisualElement element in root.Query().OfType<Button>()){var name = element.name;var methodBinding = GetBoundMethodName(element); // 获取绑定的回调方法名sb.AppendLine($"public void OnButton_{name}Clicked() {{ /* Call {methodBinding} */ }}");}string className = "UIBindings";string filePath = Path.Combine(Application.dataPath, $"Scripts/UI/{className}.cs");File.WriteAllText(filePath, $@"
using UnityEngine;
using UnityEngine.Events;public class {className} : MonoBehaviour
{{{sb.ToString()}
}}
");AssetDatabase.Refresh();}}static string GetBoundMethodName(VisualElement element){// 省略获取按钮绑定的UnityEvent回调方法名的逻辑return "OnButtonClick"; // 返回样本方法名,实际应提取真实方法名}static VisualElement GetActiveUIRootElement(){// 获取当前选中的UI根元素,此处省略具体实现return null; // 返回样本null,实际应返回UI根元素}
}

在这个例子中,我们遍历UI界面元素树,找到所有的按钮并根据它们的名字生成响应的点击事件处理方法,这些方法可以在UI相关的MonoBehaviour脚本中被调用。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电商实战练习部署

基于阿里云ECS服务器实战部署 1 单架构部署方案 1.1 部署流程 传统方案 基于docker 2 持续集成&持续部署方案 随着软件开发复杂度的不断提高&#xff0c;团队开发成员间如何更好地协同工作以确保软件 开发的质量已经慢慢成为开发过程中不可回避的问题。互联网软件的开发…

护眼台灯有aaa级吗为什么?一文揭晓护眼台灯照度等级分类

尽管台灯是一个很成熟的行业&#xff0c;但却时不时也会冒出一些新的概念和名词。比如近些年的”AAA级”台灯&#xff0c;很频繁地出现在我们视野中。给人感觉似乎带”AAA级”的台灯&#xff0c;要比其他的强上一头。那到底是真是假呢&#xff1f; 一、护眼台灯有AAA级吗&…

字节跳动推出MagicVideo-V2超高清文生视频模型

&#x1f989; AI新闻 &#x1f680; 字节跳动推出MagicVideo-V2超高清文生视频模型 摘要&#xff1a;MagicVideo-V2是由字节跳动的研究人员开发的一种超高清文生视频模型。该模型在视频的高清度、润滑度、连贯性、文本语义还原等方面表现出色&#xff0c;比目前主流的文生视…

leetcode 1.两数之和(C++)DAY1(待补充哈希表法)

文章目录 1.题目描述示例提示 2.解答思路3.实现代码结果4.总结 1.题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&…

ffmpeg操作实战001:视频+音频文件融合

一、功能需求 把视频文件video.mp4 和音频文件audio.wav融合在一起&#xff0c;输出视频文件output.mp4 二、操作指令 ffmpeg -i video.mp4 -i audio.wav -c:v copy -map 0:v:0 -map 1:a:0 output.mp4 三、参数说明 ffmpeg: 这是用于执行FFmpeg命令行工具的命令。-i video…

04. 【Linux教程】安装 Linux 操作系统

通过前面的小节学习&#xff0c;我们已经对 Linux 操作系统有了简单的了解&#xff0c;同时也在 Windows 下安装了虚拟机软件 VMware &#xff0c;那么本节课我们就介绍下如何使用虚拟机软件安装 Linux 操作系统。 通过第一小节的学习我们知道 Linux 有很多的发行版本&#xf…

工信部颁发的《计算机视觉处理设计开发工程师》中级证书

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…

Python 连接 mysql 详解(mysql-connector-python)

文章目录 1 概述1.1 第三方库&#xff1a;mysql-connector-python1.2 可视化工具&#xff1a;navicat1.3 创建测试数据库 2 连接 mysql 数据库2.1 创建一个连接2.2 捕获连接异常2.3 从配置文件中获取连接信息 3 执行 sql 语句3.1 插入、更新、删除3.2 查询 1 概述 1.1 第三方库…

深度学习系列56:使用whisper进行语音转文字

1. openai-whisper 这应该是最快的使用方式了。安装pip install -U openai-whisper&#xff0c;接着安装ffmpeg&#xff0c;随后就可以使用了。模型清单如下&#xff1a; 第一种方式&#xff0c;使用命令行&#xff1a; whisper japanese.wav --language Japanese --model…

MySQL运维实战(5.3) MySQL数据乱码的一些情况

作者&#xff1a;俊达 表数据乱码 表数据出现乱码的情况通常是由于数据的真实编码与相关参数不一致引起的&#xff0c;其中包括常见的参数如character_set_client、character_set_results、字段编码以及终端编码等。确保这些参数保持一致&#xff0c;可以有效预防和解决乱码问…

歌声悠扬如往昔

有一首歌 - 朱晓琳&#xff08;网易云单曲&#xff09; 作词 : 陈彼得作曲 : 陈彼得有一首歌我想起你那时候微风轻轻有一首歌我想起你你的感觉温馨有多少的欢笑就有多少的忧伤 愿时光在这里停住(好景不常在)歌声悠扬如往昔哦哦哦咿咿咿有一首歌我和你词意朦胧旋律依稀唱一首歌…

【数据结构 09】哈希

哈希算法&#xff1a;哈希也叫散列、映射&#xff0c;将任意长度的输入通过散列运算转化为固定长度的输出&#xff0c;该输出就是哈希值&#xff08;散列值&#xff09;。 哈希映射是一种压缩映射&#xff0c;通常情况下&#xff0c;散列值的空间远小于输入值的空间。 哈希运…

如何在个人PC的桌面创建一个类似网吧的游戏菜单并分类?

GGTools 免费的桌面图标管理器、软件菜单、游戏菜单 单机版游戏菜单、个人/家用/家庭版游戏菜单、轻量级图标收纳软件

GPT用来润色论文\生成完整长篇论文\进行AI绘图,真的太香了!

详情点击公众号&#xff1a;技术科研吧 链接&#xff1a;GPT用来润色论文\生成完整长篇论文\进行AI绘图&#xff0c;真的太香了&#xff01; 第一&#xff1a;2024年AI领域最新技术 1.OpenAI新模型-GPT-5 2.谷歌新模型-Gemini Ultra 3.Meta新模型-LLama3 4.科大讯飞-星火认…

Jenkins(三):自动化部署SpringBoot项目

前言 在软件开发过程中&#xff0c;自动化部署已经成为不可或缺的一环。Jenkins是一个广泛使用的开源自动化部署工具&#xff0c;它提供了强大的功能和灵活的配置选项&#xff0c;可以帮助开发团队实现高效的持续集成和持续部署。本文将详细介绍如何使用Jenkins自动化部署Spri…

6-树-二叉树的层序遍历 II

这是树的第7篇算法&#xff0c;力扣链接。 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,nu…

前端JavaScript篇之常用的正则表达式有哪些?

目录 常用的正则表达式有哪些&#xff1f; 常用的正则表达式有哪些&#xff1f; 常用的正则表达式包括以下几个方面&#xff1a; 匹配16进制颜色值&#xff1a;#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})可以用于匹配16进制颜色值&#xff0c;如"#ff0000"或"#f00"…

【MySQL】——数据定义

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

IDEA插件ChatGPT - Easycode安装使用

IDEA插件ChatGPT - Easycode简介 ChatGPT - Easycode 是一个由 OpenAI 开发的 IntelliJ IDEA 插件,它可以利用 ChatGPT 的强大语言生成能力,帮助开发人员提高编码效率。 主要功能: 代码生成:可以根据自然语言描述生成代码,支持多种编程语言,包括 Java、Python、JavaSc…

【漏洞复现】MDVR数字视频录像机认证绕过漏洞

Nx01 产品简介 MDVR&#xff08;Mobile Digital Video Recorders&#xff09;硬盘录像机是一种使用先进的视音频编解码技术将车内外的视频进行数模转换&#xff0c;进行压缩存储的设备。 Nx02 漏洞描述 阿根廷研究员发现&#xff0c;通过使用“Cookie&#xff1a; uid admin”…