Unity的Editor Window允许你创建自定义的编辑器工具来扩展Unity编辑器功能,提高工作流程效率。以下是开发自定义Editor Window的完整指南:
1. 创建基本的Editor Window
csharp
复制
下载
using UnityEditor; using UnityEngine; public class MyCustomWindow : EditorWindow { // 添加菜单项 [MenuItem("Tools/My Custom Window")] static void ShowWindow() { // 获取或创建窗口 var window = GetWindow<MyCustomWindow>(); window.titleContent = new GUIContent("Custom Window"); window.Show(); } // 窗口的GUI内容 void OnGUI() { GUILayout.Label("Welcome to My Custom Window", EditorStyles.boldLabel); if (GUILayout.Button("Click Me!")) { Debug.Log("Button was clicked!"); } } }
2. 常用GUI元素
csharp 复制 下载 void OnGUI() { // 文本输入 string text = EditorGUILayout.TextField("Text Field", "Default Value"); // 滑动条 float sliderValue = EditorGUILayout.Slider("Slider", 0.5f, 0f, 1f); // 切换按钮 bool toggle = EditorGUILayout.Toggle("Toggle", true); // 下拉菜单 int popupIndex = EditorGUILayout.Popup("Popup", 0, new string[] {"Option 1", "Option 2", "Option 3"}); // 颜色选择器 Color color = EditorGUILayout.ColorField("Color", Color.red); // 对象字段 GameObject obj = (GameObject)EditorGUILayout.ObjectField("GameObject", null, typeof(GameObject), true); }
1. 保存窗口状态
csharp 复制 下载 // 在窗口类中添加 private string someText = "Default"; private float someValue = 0.5f; void OnGUI() { someText = EditorGUILayout.TextField("Text Field", someText); someValue = EditorGUILayout.Slider("Slider", someValue, 0f, 1f); // 当窗口关闭时,这些值会自动保存 }
2. 处理选择的对象
csharp 复制 下载 void OnGUI() { // 获取当前选择的游戏对象 GameObject selected = Selection.activeGameObject; if (selected != null) { EditorGUILayout.LabelField("Selected Object: " + selected.name); // 修改选中的对象 selected.transform.position = EditorGUILayout.Vector3Field("Position", selected.transform.position); } else { EditorGUILayout.HelpBox("No GameObject selected", MessageType.Info); } } // 当选择改变时更新窗口 void OnSelectionChange() { Repaint(); }
3. 创建可停靠窗口
csharp 复制 下载 [MenuItem("Tools/Dockable Window")] static void ShowDockableWindow() { var window = GetWindow<MyCustomWindow>(); window.titleContent = new GUIContent("Dockable Window"); // 设置窗口为浮动、可停靠 window.Show(); window.ShowTab(); }
4. 自定义样式和布局
csharp 复制 下载 void OnGUI() { // 使用自定义样式 GUIStyle customStyle = new GUIStyle(EditorStyles.label); customStyle.normal.textColor = Color.blue; customStyle.fontSize = 14; EditorGUILayout.LabelField("Styled Label", customStyle); // 水平布局 EditorGUILayout.BeginHorizontal(); { GUILayout.Button("Button 1"); GUILayout.Button("Button 2"); } EditorGUILayout.EndHorizontal(); // 垂直布局 EditorGUILayout.BeginVertical("box"); { EditorGUILayout.LabelField("In a box"); EditorGUILayout.LabelField("Also in the box"); } EditorGUILayout.EndVertical(); }
1. 批量重命名工具
csharp 复制 下载 public class RenamerWindow : EditorWindow { private string baseName = "Object_"; private int startNumber = 0; [MenuItem("Tools/Batch Renamer")] static void ShowWindow() { GetWindow<RenamerWindow>("Batch Renamer"); } void OnGUI() { baseName = EditorGUILayout.TextField("Base Name", baseName); startNumber = EditorGUILayout.IntField("Start Number", startNumber); if (GUILayout.Button("Rename Selected Objects")) { RenameSelectedObjects(); } } void RenameSelectedObjects() { GameObject[] selected = Selection.gameObjects; for (int i = 0; i < selected.Length; i++) { selected[i].name = baseName + (startNumber + i); } } void OnSelectionChange() { Repaint(); } }
2. 快速创建预设工具
csharp 复制 下载 public class PrefabCreator : EditorWindow { private GameObject prefab; private int count = 5; private Vector3 spacing = Vector3.one; [MenuItem("Tools/Prefab Creator")] static void ShowWindow() { GetWindow<PrefabCreator>("Prefab Creator"); } void OnGUI() { prefab = (GameObject)EditorGUILayout.ObjectField("Prefab", prefab, typeof(GameObject), false); count = EditorGUILayout.IntField("Count", count); spacing = EditorGUILayout.Vector3Field("Spacing", spacing); if (GUILayout.Button("Create Prefabs") && prefab != null) { CreatePrefabs(); } } void CreatePrefabs() { for (int i = 0; i < count; i++) { Vector3 position = new Vector3(i * spacing.x, i * spacing.y, i * spacing.z); PrefabUtility.InstantiatePrefab(prefab).transform.position = position; } } }
组织代码:将大型编辑器工具拆分为多个脚本和类
添加撤销支持:使用Undo.RecordObject记录可撤销操作
性能优化:避免在OnGUI中进行昂贵计算
错误处理:验证用户输入并提供有用的错误消息
文档:添加工具提示和使用说明
保存偏好:使用EditorPrefs保存用户偏好设置
通过以上方法,你可以创建功能强大且用户友好的自定义Unity编辑器工具,大大提高开发效率。