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

关于Unity中字典在Inspector的显示

字典在Inspector的显示

方法一:实现ISerializationCallbackReceiver接口

《unity3D游戏开发第二版》记录
在编辑面板中可以利用序列化监听接口特性对字典进行序列化。
主要继承ISerializationCallbackReceiver接口 实现OnAfterDeserialize() OnBeforeSerialize() 的方法进行监听序列化和反序列化之前的事件。

例子:
配置的ScriptableObject脚本:

[CreateAssetMenu(fileName = "FileName2PathConfig", menuName = "xasset/Custom/FileName2PathConfig")]public class FileName2PathConfig : ScriptableObject{public SerializationDic<string, string> fileDictionary;}// Dictionary<TKey, TValue> 可序列化字典[Serializable]public class SerializationDic<TKey, TValue> :ISerializationCallbackReceiver{[SerializeField]List<TKey> keys;[SerializeField]List<TValue> values;Dictionary<TKey, TValue> target;public Dictionary<TKey, TValue> ToDictionary() { return target; }public SerializationDic(Dictionary<TKey, TValue> target){this.target = target;}public void OnBeforeSerialize(){keys = new List<TKey>(target.Keys);values = new List<TValue>(target.Values);}public void OnAfterDeserialize(){var count = Math.Min(keys.Count, values.Count);target = new Dictionary<TKey, TValue>(count);for (var i = 0; i < count; ++i){target.Add(keys[i], values[i]);}}}

控制Inspector面板显示的脚本:

[CustomEditor(typeof(SerializationDic<string,string>))]public class SerializationDicEditor : Editor{public override void OnInspectorGUI(){//更新数据serializedObject.Update();SerializedProperty propertyKey=serializedObject.FindProperty("keys");SerializedProperty propertyValue=serializedObject.FindProperty("values");int size=propertyKey.arraySize;GUILayout.BeginVertical();for(int i=0;i<size;i++){GUILayout.BeginHorizontal();SerializedProperty key=propertyKey.GetArrayElementAtIndex(i);SerializedProperty value=propertyValue.GetArrayElementAtIndex(i);key.stringValue=EditorGUILayout.TextField("key",key.stringValue);value.stringValue=EditorGUILayout.TextField("value",value.stringValue);GUILayout.EndHorizontal();}GUILayout.EndVertical();//保存数据serializedObject.ApplyModifiedProperties();}}

效果

方法二 使用插件Odin Inspector 官网

代码:

[CreateAssetMenu(fileName = "FileName2PathConfig", menuName = "xasset/Custom/FileName2PathConfig")]public class FileName2PathConfig : SerializedScriptableObject{[DictionaryDrawerSettings(KeyLabel = "资源名字", ValueLabel = "资源路径")]public Dictionary<string, string> fileDictionary;}

效果:

http://www.lryc.cn/news/252192.html

相关文章:

  • 使用Plex结合cpolar搭建本地私人媒体站并实现远程访问
  • svn合并冲突时每个选项的含义
  • 指针、数组与函数例题3
  • ThreeJs样例 webgl_shadow_contact 分析
  • Nginx(缓冲区)
  • MQTT协议理解并实践
  • 实现一个简单的网络通信下(udp)
  • Linux中office环境LibreOffice_7.6.2下载
  • Linux快捷控制
  • 免费插件集-illustrator插件-Ai插件-重复复制-单一对象页面排版
  • GO基础之变量与常量
  • Docker Compose简单入门
  • 使用 PHPMailer 实现邮件的实时发送
  • 在Spring Boot中使用JavaMailSender发送邮件
  • python动态圣诞下雪图
  • 随心玩玩(十)git
  • 每日一练【盛最多水的容器】
  • Linux C语言 38-进程间通信IPC之信号
  • 前端使用 xlsx.js 工具读取 excel 遇到时间日期少 43 秒的解决办法
  • 问题记录-maven依赖升级或替换(简单版)
  • 00Hadoop数据仓库平台
  • java-jar包
  • Flink运行时架构核心概念
  • docker安装达梦数据库并挂在数据卷
  • ROS第一个程序——helloworld
  • 【Python 训练营】N_17 冒泡排序
  • 虚拟机docker中的Nginx部署
  • 06、pytest将多个测试放在一个类中
  • 实体类转SQL工具类
  • 高端制造业中的通用性超精密3D光学测量仪器