You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何创建自定义资源菜单以生成指定父类的C#脚本?

Unity自定义右键菜单生成指定父类的C#脚本

要实现自定义右键菜单生成继承特定类的C#脚本,核心是利用Unity的Editor扩展API和MenuItem特性,步骤如下:

1. 准备Editor目录

先在项目根目录新建Editor文件夹(如果没有的话),所有编辑器扩展脚本必须放在这个目录下,才会被Unity识别为编辑器工具,不会被打包进游戏包。

2. 编写菜单与文件生成逻辑

通过[MenuItem]特性给右键菜单添加选项,再编写代码处理路径获取、模板生成、文件创建和资源刷新的逻辑。

以下是完整示例,以生成继承自ScriptableObject的脚本为例:

using UnityEditor;
using UnityEngine;
using System.IO;

public class CustomScriptCreator
{
    // 定义右键菜单路径,优先级设为101(默认C#脚本优先级是100,这样菜单会排在它下方)
    [MenuItem("Assets/Create/C# ScriptableObject", false, 101)]
    public static void CreateScriptableObjectScript()
    {
        // 获取Project窗口选中的文件夹路径,默认指向Assets根目录
        string selectedPath = AssetDatabase.GetAssetPath(Selection.activeObject);
        if (string.IsNullOrEmpty(selectedPath))
        {
            selectedPath = "Assets";
        }
        else if (!Directory.Exists(selectedPath))
        {
            // 如果选中的是文件,自动取它所在的文件夹路径
            selectedPath = Path.GetDirectoryName(selectedPath);
        }

        // 弹出输入框让用户输入脚本名称
        string scriptName = EditorUtility.SaveFilePanelInProject("创建ScriptableObject脚本", "NewScriptableObject", "cs", "请输入脚本名称");
        if (string.IsNullOrEmpty(scriptName))
        {
            return;
        }

        // 定义脚本模板,替换类名为用户输入的名称,父类设为ScriptableObject
        string scriptTemplate = $@"using UnityEngine;

[CreateAssetMenu(fileName = ""New{Path.GetFileNameWithoutExtension(scriptName)}"", menuName = ""Custom/{Path.GetFileNameWithoutExtension(scriptName)}"")]
public class {Path.GetFileNameWithoutExtension(scriptName)} : ScriptableObject
{{
    private void OnEnable()
    {{
        // 初始化逻辑
    }}

    private void OnDisable()
    {{
        // 清理逻辑
    }}
}}";

        // 写入脚本文件
        File.WriteAllText(scriptName, scriptTemplate);
        // 刷新资源库,让Unity立刻识别新脚本
        AssetDatabase.Refresh();
        // 自动选中新创建的脚本,提升操作流畅度
        Object newScript = AssetDatabase.LoadAssetAtPath<Object>(scriptName);
        Selection.activeObject = newScript;
    }
}

3. 自定义父类与模板

如果要生成继承自你自己的自定义父类(比如BaseGameClass),只需修改模板中的父类部分即可:

string scriptTemplate = $@"using UnityEngine;

public class {Path.GetFileNameWithoutExtension(scriptName)} : BaseGameClass
{{
    public override void Initialize()
    {{
        base.Initialize();
        // 自定义初始化逻辑
    }}

    public override void UpdateLogic()
    {{
        base.UpdateLogic();
        // 自定义更新逻辑
    }}
}}";

注意事项

  • 所有Editor脚本必须放在Editor目录下,否则打包时会抛出编译错误。
  • MenuItem的第三个参数是优先级,数值越大菜单位置越靠后,可根据需求调整排序。
  • 操作资源时优先使用AssetDatabase相关API,而非直接调用System.IO,确保Unity能正确管理资源状态。

内容的提问来源于stack exchange,提问作者Lol_man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:22:15