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
相关产品推荐
相关产品推荐

