Unity 通过配置文件生成代码

这篇具有很好参考价值的文章主要介绍了Unity 通过配置文件生成代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


在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)
————————————————

​最后我们放松一下眼睛
unity代码里面生成代码,unity,游戏引擎,c#文章来源地址https://www.toymoban.com/news/detail-832493.html

到了这里,关于Unity 通过配置文件生成代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【用unity实现100个游戏之16】Unity中程序化生成的2D地牢5(附项目源码,完结)

    【视频】:https://www.youtube.com/watch?app=desktopv=-QOCX6SVFsklist=PLcRSafycjWFenI87z7uZHFv6cUG2Tzu9vindex=1 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入

    2024年02月03日
    浏览(34)
  • Unity通过代码切换材质

    「你提需求,我来做」征集活动开始啦!我们正在寻找那些有想法、有创意的小伙伴,为我们带来新的挑战和灵感。 无论是一个小小的功能调整,还是一个全新的创意想法,我们都欢迎你向我们留言并提出你的需求。我们会认真考虑每一个想法,并在可能的情况下尽快实现它

    2024年02月13日
    浏览(31)
  • unity通过代码动态改变模型颜色

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class ModelShine : MonoBehaviour { }

    2024年02月05日
    浏览(31)
  • 【实现100个unity游戏之20】制作一个2d开放世界游戏,TileMap+柏林噪声生成随机地图(附源码)

    我的上一篇文章介绍了TileMap的使用,主要是为我这篇做一个铺垫,看过上一篇文章的人,应该已经很好的理解TileMap的使用了,这里我就不需要过多的解释一些繁琐而基础的知识了,省去很多时间。所有没看过上一篇文章的小伙伴我强烈建议先去看看:

    2024年01月20日
    浏览(32)
  • Unity代码生成实例物体

    1、Instantiate(生成的物体,生成位置,旋转角度); 比如: 2、前面可以使用GameObject的变量接收,如果Instantiate生成的是预制体,则GameObject变量具有预制体的一切参数,可利用这一点为预制体的一些参数赋值。 这里的enemyMove是挂接在预制体上的代码,代码需要将player物体传递

    2024年02月13日
    浏览(30)
  • 【游戏开发小技】Unity通过UI全屏图来模糊场景画面(Shader | 模糊 | 滤镜 | Blur)

    一、前言 嗨,大家好,我是新发。 以前我写文章都是很长很长,接下来我会尝试用新的方式来写博客,尽量简短,以实用为主。同时也是作为自己零碎的一些记录,方便查阅。 本文我要说的是在 Unity 中通过 UI 全屏图来模糊场景画面的效果。 二、效果演示 这是没用模糊效果

    2024年02月05日
    浏览(30)
  • 【用unity实现100个游戏之9】使用Unity制作类八方旅人、饥荒风格的俯视角2.5D游戏(附工程代码)

    【视频】:https://www.bilibili.com/video/BV1DT4y1A7DJ/ 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入 2.5D游戏 是一种介于二维和三维之间的游戏形式。它通常在二维平面上展示游戏内容,但利用三维技术来实现更加逼真的图像效果。 在2.5D游戏

    2024年02月04日
    浏览(38)
  • Unity学习笔记--如何优雅简便地利用对象池生成游戏对象(进阶版)LRU + 对象池

    之前写过一篇关于对象池的文章,现在来看写的并不是很好,所以来考虑优化下。 现在来看一年前写的代码,越看越不能入目hhh Unity学习笔记–如何优雅简便地利用对象池生成游戏对象 Unity学习笔记–使用 C# 开发一个 LRU PoolManager.cs BaseFactory.cs 创建 Factory 创建 object 创建 Bu

    2024年02月13日
    浏览(29)
  • unity 如何生成exe文件

    unity 如何生成exe文件 在Unity中,可以通过以下步骤生成exe文件: 在Unity界面中,点击菜单栏的“File”,选择“Build Settings”。 在“Build Settings”窗口中,选择要生成的平台(例如Windows)。 点击“Player Settings”按钮,进入“Player Settings”窗口,设置应用程序的相关属性,如图

    2024年02月11日
    浏览(25)
  • unity 打砖块—休闲小游戏,摸鱼必备(完整代码)

    打砖块小游戏通常会被当做Unity学习的第一个案例,下面给大家介绍如何实现打砖块案例的    建立cube,大体这个样子,可以建造自己喜欢的形状和颜色。 给正方形的cube添加刚体  将摄像机的位置对准创建的物体 创建一个“子弹”,添加钢体,然后拖动到文件夹,变成预设

    2023年04月08日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包