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

Unity Inspector Dropdown菜单选项图片不显示问题求助

在Unity Inspector下拉菜单中显示选项图片的解决方案

Unity内置的EditorGUILayout.Popup仅会在选中项展示图标,下拉列表里只显示文字。要实现每个下拉选项都附带对应小图片,需要用EditorGUILayout.DropdownButton配合GenericMenu自定义选项绘制逻辑,具体实现如下:

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(RuneMaker))]
public class RuneMakerEditor : Editor
{
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        RuneMaker runeMaker = (RuneMaker)target;

        // 设置下拉按钮的显示内容,选中时带对应图片
        string selectedLabel = runeMaker.runeToEditIndex >= 0 && runeMaker.runeToEditIndex < runeMaker.runeStorage.runes.Count 
            ? $"rune {runeMaker.runeToEditIndex}" 
            : "Select rune";
        GUIContent dropdownContent = new GUIContent(selectedLabel);
        if (runeMaker.runeToEditIndex >= 0 && runeMaker.runeToEditIndex < runeMaker.runeStorage.runes.Count)
        {
            dropdownContent.image = runeMaker.runeStorage.runes[runeMaker.runeToEditIndex].preview;
        }

        // 绘制下拉按钮,点击弹出自定义菜单
        if (EditorGUILayout.DropdownButton(dropdownContent, FocusType.Keyboard))
        {
            GenericMenu menu = new GenericMenu();

            for (int i = 0; i < runeMaker.runeStorage.runes.Count; i++)
            {
                int index = i; // 捕获循环变量,避免闭包取值异常
                var currentRune = runeMaker.runeStorage.runes[i];

                // 添加菜单项及选中回调
                menu.AddItem(new GUIContent(""), false, () => 
                {
                    runeMaker.runeToEditIndex = index;
                    Undo.RecordObject(runeMaker, "Select Rune to Edit");
                    EditorUtility.SetDirty(runeMaker);
                });
                // 自定义选项绘制:图片+文字+选中背景
                menu.SetCustomMenuItem(menu.GetItemCount() - 1, (rect, isSelected) => 
                {
                    // 绘制20x20的符文预览图
                    Rect imgRect = new Rect(rect.x + 4, rect.y + 2, 20, 20);
                    if (currentRune.preview != null)
                    {
                        EditorGUI.DrawTextureTransparent(imgRect, currentRune.preview);
                    }
                    // 绘制符文名称
                    Rect textRect = new Rect(rect.x + 28, rect.y, rect.width - 28, rect.height);
                    EditorGUI.LabelField(textRect, $"rune {index}");
                    // 绘制选中状态背景
                    if (isSelected)
                    {
                        EditorGUI.DrawRect(rect, new Color(0.2f, 0.4f, 0.8f, 0.3f));
                    }
                });
            }

            // 无符文时显示提示
            if (runeMaker.runeStorage.runes.Count == 0)
            {
                menu.AddDisabledItem(new GUIContent("No runes available"));
            }

            menu.ShowAsContext();
        }

        if (GUILayout.Button("New rune")) runeMaker.NewRune();
    }
}

关键说明

  • DropdownButton替代Popup:用下拉按钮作为触发入口,点击后弹出自定义菜单
  • GenericMenu自定义绘制:通过SetCustomMenuItem完全控制每个选项的视觉表现,同时支持图片、文字和选中状态
  • 闭包变量处理:循环中捕获当前索引到局部变量,避免回调时取到循环的最终值
  • Undo与脏标记:选中选项后记录操作并标记对象为脏,确保修改可保存、可撤销

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:40:12