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

如何在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();
        }
    }
}

关键修改说明

  1. 字典类型调整:将原Dictionary<string, string>改为Dictionary<GameObject, string>,直接存储GameObject对象引用,彻底避免重名GameObject导致的匹配错误。
  2. 数据收集逻辑优化:
    • 新增RefreshScriptData方法统一处理数据收集,方便手动刷新
    • 打开窗口时自动调用刷新,避免旧数据残留
    • 同一GameObject上有多个自定义脚本时,自动追加脚本名称(用逗号分隔)
  3. GUI布局修复:
    • 使用EditorGUILayout.BeginHorizontal()/EndHorizontal()实现每行横向布局,同时显示GameObject选择框和脚本名称
    • ObjectField指定类型为GameObject,并开启允许场景对象选择(第三个参数true)
    • 添加刷新按钮,支持场景对象变化后手动更新数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:47:43