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
相关产品推荐
相关产品推荐

