当前位置: 首页 > news >正文

【Unity编辑器拓展】实现ScriptableObject的结构体结构中,枚举变量显示中文描述

问题描述


【旧问题】
在Unity开发中,ScriptableObject(SO)常使用枚举来定义选项。为了保持代码规范,枚举值通常使用英文,但在Unity编辑器的Inspector面板中,纯英文显示对非英语母语的策划或美术人员不够友好,难以快速理解每个选项的含义。

此问题已在我这一篇文章中解决;【Unity编辑器拓展】实现ScriptableObject中枚举显示中文描述_unity 怎么给枚举加上注释 可以在inspector上看到-CSDN博客

【新问题】
虽然上一篇文章初步解决了旧问题,但代码中还存在一个遗漏:目前还没有处理 ScriptableObject(SO)文件里的嵌套结构。具体来说,就是 SO 中包含的结构体里包裹着枚举变量,我们需要将其[Description]特性中的描述信息,替换为该枚举变量本身。

如下图所示:


解决方案


在原有的代码基础上,添加上对结构体这样的嵌套结构的处理;


(1)定义带中文描述的枚举

using System.ComponentModel; // 引用命名空间 - 为枚举添加描述属性 // ===== 物品图标分类 ===== public enum ItemIconKey { [Description("Weapon - 武器图标")] Weapon, [Description("Armor - 防具图标")] Armor, [Description("Accessory - 饰品图标")] Accessory, [Description("Healing - 治疗类物品图标")] Healing, [Description("Revive - 复活类物品图标")] Revive, [Description("Cure - 接触异常状态类物品图标")] Cure, [Description("KeyItem - 任务物品/关键物品图标")] KeyItem, }

(2)编写编辑器脚本

编写一个Unity编辑器脚本,通过反射读取[ Description ] 特性并替换显示文本
文件名:LocalizedEnumDrawer.cs
存放路径:Assets/Editor/LocalizedEnumDrawer.cs

using UnityEngine; using UnityEditor; using System; using System.ComponentModel; using System.Reflection; /// <summary> /// 自定义属性绘制器,用于枚举类型的本地化显示 /// 继承自PropertyDrawer,并应用于所有Enum类型 /// </summary> [CustomPropertyDrawer(typeof(Enum), true)] public class LocalizedEnumDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { if (property.propertyType != SerializedPropertyType.Enum) { EditorGUI.PropertyField(position, property, label, true); return; } Type enumType = fieldInfo.FieldType; if (enumType == null || !enumType.IsEnum) { EditorGUI.PropertyField(position, property, label, true); return; } string[] enumNames = property.enumNames; string[] displayNames = new string[enumNames.Length]; for (int i = 0; i < enumNames.Length; i++) { FieldInfo enumField = enumType.GetField(enumNames[i]); DescriptionAttribute[] attributes = (DescriptionAttribute[])enumField.GetCustomAttributes(typeof(DescriptionAttribute), false); if (attributes.Length > 0) { displayNames[i] = attributes[0].Description; } else { displayNames[i] = enumNames[i]; } } EditorGUI.BeginChangeCheck(); int newIndex = EditorGUI.Popup(position, label.text, property.enumValueIndex, displayNames); if (EditorGUI.EndChangeCheck()) { property.enumValueIndex = newIndex; } } }

完成效果


http://www.jsqmd.com/news/886530/

相关文章:

  • Unity中稳定低开销3D描边实现方案
  • Web渗透测试能力成长地图:从工具使用到漏洞认知跃迁
  • 基于GPS与RTC的高精度时钟设计:从触摸屏GUI到MOSFET驱动的嵌入式实践
  • Unity UI交互进阶:手把手教你打造一个支持单击、双击、长按的万能按钮组件
  • 告别抓瞎!手把手教你用Postman搞定微信小程序接口测试(附环境变量与断言实战)
  • UE5 RPG实战:用Motion Warping插件搞定角色释放技能时的自动转向(附蓝图接口优化)
  • 举一个具体例子说明为什么索引不是越多越好,举具体字段
  • 原子化半格:从数据中“生长”出可解释规则与泛化模型
  • MCBx51评估板:8051单片机开发全兼容方案解析
  • 毕业设计:基于java的在线问卷调查系统的设计与实现(源码)
  • Linux服务器被黑排查指南:进程、文件、日志、网络四维证据链
  • 2027考研全套资料免费分享
  • 从‘Hello World’到数据迁移:KingbaseES类型转换的5个高频实战场景解析
  • 哔哩漫游X:解锁B站全功能体验的终极指南
  • 阿波罗登月,不可能:读心术与影子叙事 ——不是向全世界展示登月,而是向全世界注射登月
  • OBS多平台直播革命:obs-multi-rtmp插件让你一次推流,全网覆盖
  • 关联规则挖掘在Calabi-Yau流形Hodge数分析中的应用与复现
  • 深挖 okbiye 核心能力|AI 毕业论文写作新模式,高效攻克毕业创作难题
  • 基于ESP32与Modbus RTU的太阳能光伏数据采集系统实战
  • 抖音内容高效采集终极指南:3大核心策略解锁完整下载方案
  • 别再乱点屏幕了!用Monkey黑白名单精准测试你的Android App(附完整配置文件)
  • 从RD、CS到WK:一文讲透SAR主流成像算法的演进与选型实战
  • Unity图片优化实战:解决UI图片内存暴涨与比例失控
  • 百度文心一言开发者如何通过Taotoken低成本接入多模型API
  • 2026 年 AI 毕业论文工具横评:从降 AIGC 率到智能排版,10 款平台实测谁才是毕业季的 “救命稻草”
  • Veo 2提示词性能瓶颈诊断:基于1726组AB测试的token敏感度热力图与阈值红线预警
  • 为什么选择raylib?5分钟快速上手的跨平台游戏开发库终极指南
  • 5分钟精通SPT-AKI存档编辑器:离线塔科夫终极修改指南
  • 基于MAX78000的医疗紧急呼叫系统:边缘AI与低功耗设计实战
  • 数据库范式化设计与性能优化全攻略