当前位置: 首页 > 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.rkmt.cn/news/1384937.html

相关文章:

  • 不止于采样:深度挖掘英飞凌Aurix EVADC的硬件触发与高级仲裁机制
  • APIfox自动化测试实战:如何用后置脚本实现接口间数据传递(含公共断言脚本写法)
  • 为Claude Code配置Taotoken解决访问不稳定与Token不足难题
  • 毕业设计:基于java的在线问卷调查系统的设计与实现(源码)
  • 2026年第20周最热门的开源项目(Github)
  • Android 高频面试题汇总,26 道经典考题轻松应对面试
  • Airtest Poco实战:5分钟搞定微信小程序自动化测试环境搭建与元素抓取
  • 关联规则挖掘在Calabi-Yau流形Hodge数分析中的应用与复现
  • 优化器偷偷做了什么:一次子查询消除让我从32秒等到24毫秒
  • 别再乱点屏幕了!用Monkey黑白名单精准测试你的Android App(附完整配置文件)
  • 第三卷第4章:原型模式设计思想
  • Godot4 2D游戏开发避坑指南:TileMap绘制、节点顺序与相机设置的三个常见问题
  • 5分钟精通SPT-AKI存档编辑器:离线塔科夫终极修改指南
  • 基于MAX78000的医疗紧急呼叫系统:边缘AI与低功耗设计实战
  • 从零构建:深入理解Linux启动过程
  • 2026年业务分析报告服务TOP5深度测评:报告生成能力与落地效果全对比 - 科技焦点
  • 电信运营商每月处理海量工单,如何不再出错?基于AI Agent的端到端自动化解决方案
  • UE5 Mac环境搭好了,然后呢?给新手的第一个5分钟:创建、操控并理解你的第一个角色
  • Stylized Clouds Pack技术解析:卡通云朵的Shader架构与URP性能优化
  • 用了ChatGPT写论文初稿,如何降低AI率并同步减少文字重复率?
  • PDF4QT:免费开源的PDF全能工具箱,轻松处理各类文档难题
  • 不止是随机播放:用Unity VideoPlayer做个简易的广告机或展厅视频轮播系统
  • 简单学习 --> KV Cache
  • 简单学习 --> GPT架构
  • 从‘Hello World’到数据迁移:KingbaseES类型转换的5个高频实战场景解析
  • 飞书文档一键批量导出:企业知识库迁移效率提升95%的终极解决方案
  • Win11 IIS搭建局域网网站避坑指南:MIME类型、目录浏览这些设置千万别乱动
  • 保姆级避坑指南:在Ubuntu 22.04上搞定ROS2 Humble、PX4与Gazebo的联合仿真(附Empy版本降级)
  • Burp Suite拦截与替换机制深度解析:从协议层到规则链
  • BurpSuite本地HTTPS流量捕获全链路解析