Assets 的 Unity 上下文菜单有各种有用的快捷方式,但没有快捷方式可以快速创建自定义编辑器。相反,如果我想创建一个自定义编辑器,我必须经历所有这些烦人的样板步骤:
Editor
目录(如果还没有创建),进入右边的子目录 Create
-> C# Script
(实际上应该称为 C# Component Script
) MonoBehavior
的东西 Editor
附加到类名 using UnityEditor
CustomEditor
属性Editor
......在能够真正开始写我的东西之前......
某处有捷径吗?
最佳答案
新的“添加自定义编辑器”菜单项
我写了 this little script,它在 Add Custom Editor
上下文菜单中添加了一个新的 Assets
MenuItem:
用法
Component
文件夹中的 Scripts
脚本。 Add Custom Editor
。 Editor
可以自动选择,因此您可以根据需要对其进行修改。它具有相同的名称(附加了 Editor
)并且位于相同的相对路径中,但是在 Scripts/Editor
文件夹中 下面的屏幕截图显示了一个示例:给定脚本
Scripts/Test/TestScript
,它会在 Scripts/Editor/Test/TestScriptEditor
处创建一个新编辑器。注意 :除非您选择了以下脚本,否则 MenuItem 将被禁用:
.cs
文件Scripts
文件夹下的某处(可以嵌套在任何子目录中) Editor
文件夹中 设置
Create
-> C# Script
AddCustomEditorMenuItem
Scripts
目录中的脚本文件。 代码亮点
scriptName = scriptAsset.name;
// get system file path
scriptPath = Path.GetFullPath(ProjectRoot + AssetDatabase.GetAssetPath (scriptAsset));
// get file name of the editor file
editorFileName = GetEditorFileNameFor (scriptName);
// split the script path
var results = scriptPathRegex.Matches (scriptPath).GetEnumerator ();
results.MoveNext ();
var match = (Match)results.Current;
scriptsPath = match.Groups [1].Value;
scriptRelativePath = match.Groups [2].Value;
// re-combine editor path
editorPath = Path.Combine (scriptsPath, "Editor");
editorPath = Path.Combine (editorPath, scriptRelativePath);
editorPath = Path.Combine (editorPath, editorFileName);
// nicely formatted file path
editorPath = Path.GetFullPath(editorPath);
editorRelativeAssetPath = editorPath.Substring(ProjectRoot.Length);
public void WriteCustomEditorFile ()
{
// create all missing directories in the hierarchy
Directory.CreateDirectory (Path.GetDirectoryName (editorPath));
// write file
File.WriteAllText (editorPath, BuildCustomEditorCode(scriptName));
// let Asset DB pick up the new file
AssetDatabase.Refresh();
// highlight in GUI
var os = AssetDatabase.LoadAllAssetsAtPath(editorRelativeAssetPath);
EditorGUIUtility.PingObject (os[0]);
// log
Debug.Log("Created new custom Editor at: " + editorRelativeAssetPath);
}
// ...
/// <summary>
/// The menu item entry
/// </summary>
[MenuItem ("Assets/Add Custom Editor %#e", false, 0)]
public static void AddCustomEditor ()
{
var scriptAsset = Selection.activeObject;
// figure out paths
var scriptPathInfo = new ScriptPathInfo (scriptAsset);
// write file
scriptPathInfo.WriteCustomEditorFile ();
}
static string BuildCustomEditorCode (string name)
{
return @"using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(" + name + @"))]
public class " + name + @"Editor : Editor {
public override void OnInspectorGUI ()
{
base.OnInspectorGUI ();
var obj = (" + name + @") target;
if (GUILayout.Button (""Hi!"")) {
// do something with obj when button is clicked
Debug.Log(""Button pressed for: "" + obj.name);
EditorGUIUtility.PingObject (obj);
}
}
}";
}
[MenuItem ("Assets/Add Custom Editor %#e", true, 0)]
public static bool ValidateAddCustomEditor ()
{
var scriptAsset = Selection.activeObject;
if (scriptAsset == null) {
// nothing selected? (should probably not happen)
return false;
}
var path = ProjectRoot + AssetDatabase.GetAssetPath (scriptAsset);
if (!scriptPathRegex.IsMatch (path)) {
// not a Script in the Script folder
return false;
}
if (editorScriptPathRegex.IsMatch (path)) {
// we are not interested in Editor scripts
return false;
}
if (Directory.Exists (path)) {
// it's a directory, but we want a file
return false;
}
var scriptPathInfo = new ScriptPathInfo (scriptAsset);
// Debug.Log (scriptPathInfo.scriptPath);
// Debug.Log (Path.GetFullPath(AssetsPath + "/../"));
// Debug.Log (scriptPathInfo.editorRelativeAssetPath);
// Debug.Log (scriptPathInfo.editorPath);
if (File.Exists (scriptPathInfo.editorPath)) {
// editor has already been created
return false;
}
// all good!
return true;
}
关于c# - 在Unity中为Script自动添加自定义编辑器的快捷方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50203145/