如何在EditorWindow中用EditorGUILayout.ObjectField按行显示字典对应的GameObject与脚本名
修复并优化ScriptFinder EditorWindow
修改后的完整代码
using UnityEngine; using UnityEditor; using System.Collections.Generic; using System; public class ScriptFinder : EditorWindow { private Dictionary<GameObject, string> _objectScriptMap = new Dictionary<GameObject, string>(); [MenuItem("EditorUtility/Script Finder")] static void OpenScriptFinder() { var window = (ScriptFinder)EditorWindow.GetWindow(typeof(ScriptFinder)); window.titleContent = new GUIContent("Script Finder"); window.RefreshScriptData(); } private void RefreshScriptData() { _objectScriptMap.Clear(); MonoBehaviour[] allScripts = FindObjectsOfType<MonoBehaviour>(); foreach (var script in allScripts) { Type scriptType = script.GetType(); // 过滤Unity内置脚本 if (scriptType.Namespace == null || !scriptType.Namespace.StartsWith("Unity")) { GameObject targetObj = script.gameObject; if (_objectScriptMap.ContainsKey(targetObj)) { // 同一对象有多个自定义脚本时,追加脚本名 if (!_objectScriptMap[targetObj].Contains(scriptType.Name)) { _objectScriptMap[targetObj] += $", {scriptType.Name}"; } } else { _objectScriptMap.Add(targetObj, scriptType.Name); } } } } void OnGUI() { GUI.color = Color.white; // 添加刷新按钮 if (GUILayout.Button("刷新数据")) { RefreshScriptData(); } EditorGUILayout.Space(); // 遍历显示每个对象和对应的脚本 foreach (var pair in _objectScriptMap) { EditorGUILayout.BeginHorizontal(); // 显示GameObject对象选择框 EditorGUILayout.ObjectField(pair.Key, typeof(GameObject), true, GUILayout.Width(200)); // 显示对应的脚本名称 EditorGUILayout.LabelField("关联脚本:", pair.Value); EditorGUILayout.EndHorizontal(); } } }
关键修改说明
- 字典类型调整:将原
Dictionary<string, string>改为Dictionary<GameObject, string>,直接存储GameObject对象引用,彻底避免重名GameObject导致的匹配错误。 - 数据收集逻辑优化:
- 新增
RefreshScriptData方法统一处理数据收集,方便手动刷新 - 打开窗口时自动调用刷新,避免旧数据残留
- 同一GameObject上有多个自定义脚本时,自动追加脚本名称(用逗号分隔)
- 新增
- GUI布局修复:
- 使用
EditorGUILayout.BeginHorizontal()/EndHorizontal()实现每行横向布局,同时显示GameObject选择框和脚本名称 ObjectField指定类型为GameObject,并开启允许场景对象选择(第三个参数true)- 添加刷新按钮,支持场景对象变化后手动更新数据
- 使用
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

