在此之前,粗略的介绍下 CustomEditor(自定义编辑)。

Unity对于我们创建的Mono脚本提供了属性面板的展示和修改。默认情况下,Inspector面板中会显示当前脚本类的公开字段(public field),这些字段会被序列化并储存在挂载的预制上。而有些情况下我们需要自定义展示和修改面板数据展示,这时候就用到了Unity提供的CustomEditor。

CustomEditor特性:允许我们自定义当前脚本组件的Inspector检视面板。

使用方法:

  1. 1 public CustomEditor(Type inspectedType);
  2. 2 public CustomEditor(Type inspectedType, bool editorForChildClasses);

参数介绍:

inspectedType:指定自定义那个类型的面板数据

editorForChildClasses :是否子类使用同样的自定义面板,默认不使用

使用示例片段:

  1. //TestData.cs
  2.  
  3. using UnityEngine;
  4. /// <summary>
  5. /// 测试代码
  6. /// </summary>
  7. public class TestData : MonoBehaviour
  8. {
  9. [Range(0,1)]
  10. public float speed;
  11. }
  12.  
  13. //TestDataEditor.cs
  14.  
  15. using UnityEditor;
  16.  
  17. /// <summary>
  18. /// 测试代码,自定义面板数据显示
  19. /// </summary>
  20. [CustomEditor(typeof(TestData))]
  21. public class TestDataEditor : Editor
  22. {
  23. private SerializedProperty _speed;
  24. TestData _target;
  25.  
  26. private void OnEnable()
  27. {
  28. ///方式一
  29. _speed = serializedObject.FindProperty("speed");
  30.  
  31. ///方式二
  32. //_target = (TestData)target;
  33. }
  34.  
  35. public override void OnInspectorGUI()
  36. {
  37. //将_speed数据修改加入监听
  38. EditorGUI.BeginChangeCheck();
  39.  
  40. /// 方式一
  41. serializedObject.Update();
  42. EditorGUILayout.PropertyField(_speed);
  43. serializedObject.ApplyModifiedProperties();
  44.  
  45. ///方式二
  46. //_target.speed = EditorGUILayout.FloatField("速度", _target.speed);
  47.  
  48. //_speed数据修改结束监听,并在发生修改时,做“脏”标记
  49. if (EditorGUI.EndChangeCheck())
  50. {
  51. EditorUtility.SetDirty(target);
  52. }
  53. }
  54. }

在开发过程中,为了给其他同学提供一些便利,通过自定义显示面板数据是很常见的一件事。但这会导致我们有时直接获取的当前组件数据时,发现不是面板上序列化储存的值。出现这种原因是因为Editor这边直接执行了ApplyModifiedProperties,这时候我们可以通过序列化对象获取想要的数据。

  1. using UnityEngine;
  2. using UnityEditor;
  3.  
  4. /// <summary>
  5. /// 测试代码
  6. /// </summary>
  7. public class TestData : MonoBehaviour
  8. {
  9. [Range(0,1)]
  10. public float speed;
  11.  
  12. /// <summary>
  13. /// 根据使用场景调用方法
  14. /// </summary>
  15. private void TestFunc()
  16. {
  17. //序列化当前对象
  18. SerializedObject obj = new SerializedObject(this);
  19. //查找想要的数据
  20. var _speed = obj.FindProperty("speed");
  21. //进行日志输出或GUI绘制
  22. Debug.LogError($"原始数据:{speed},序列化后的数据:{_speed}");
  23. }
  24. }

总结:我们要想在编辑器这边获取CustomEditor(自定义编辑)类的序列化数据时,只需要将当前类对象序列化即可。

资料查找:

1).Unity - Scripting API: CustomEditor

2).Unity - Scripting API: CustomEditor.CustomEditor

Unity获取脚本的CustomEditor(自定义编辑)数据的更多相关文章

  1. Unity场景道具模型拓展自定义编辑器

    (一)适用情况 当游戏主角进入特定的场景或者关卡,每个关卡需要加载不同位置的模型,道具等.这些信息需要先在unity编辑器里面配置好,一般由策划干这事,然后把这些位置道具信息保存在文件,当游戏主角进入 ...

  2. Web jquery表格组件 JQGrid 的使用 - 7.查询数据、编辑数据、删除数据

    系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...

  3. 以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 (转)

    以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 (转) ; Script generated by the Inno Setup 脚本向导. ; SEE THE DOCU ...

  4. CustomEditor 自定义预览窗

    using UnityEngine; using System.Collections; public class MyTextureView : MonoBehaviour { public Tex ...

  5. Java学习-058-Jsoup爬虫获取中国所有的三级行政区划数据(三),处理二级编码缺失

    通过查看数据可知,直辖市或者某些三级行政区域没有对应的二级区域,为方便后续的地址使用,可自定义缺失的二级地址. 如下示例自定义的二级行政区域的名称为一级区域的名称,对应的源码如下所示: 将此段源码添加 ...

  6. Java 自定义Excel数据排序

    通常,我们可以在Excel中对指定列数据执行升序或者降序排序,排序时可依据单元格中的数值.单元格颜色.字体颜色或图标等.在需要自定义排序情况下,我们也可以自行根据排序需要编辑数据排列顺序.本文,将通过 ...

  7. Unity Mono脚本 加密

    加密环境 引擎版本:Unity3D 5.3.4 及更高版本 (使用Mono而并非IL2CPP) 操作系统:CentOS 6.2(Final) 加密环境:Android.IOS(暂定) 加密对象:C#源 ...

  8. Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 原理and实现

    Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 1. 应用场景 1 2. 随机抽取数据原理 1 3. 常用的实现方法:::数据库随机函数 1 4. Mssq ...

  9. 【转】PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理

    [转]PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理 只要有人用了: select t.* from ...

随机推荐

  1. ZJOI2020

    [ZJOI2015] 地震后的幻想乡 给定一个无向图 \(G\) ,\(n\) 个点 \(m\) 条边每条边权为 \([0,1]\) 的随机实数,求这张图的最小生成树的最大边权期望. \(1\le n ...

  2. Groovy基础语法

    Groovy 基础语法 变量定义 1.支持动态类型,使用def关键字定义变量 // Java中定义变量的方式 int age = 18; String name = "张三"; / ...

  3. conda cheat sheet可直接百度这个名字

  4. Linux系列之安装JDK

    卸载open jdk #查看jdk [root@localhost tools]# rpm -qa | grep jdk java-1.8.0-openjdk-headless-1.8.0.65-3. ...

  5. ExtJS 布局-Center布局(Center layout)

    更新记录: 2022年6月12日 检查发布. 2022年6月1日 开始. 1.说明 center布局将子项放置在容器的中心. 2.设置布局方法 在父容器中设置 layout: 'center', // ...

  6. 论文阅读 Real-Time Streaming Graph Embedding Through Local Actions 11

    9 Real-Time Streaming Graph Embedding Through Local Actions 11 link:https://scholar.google.com.sg/sc ...

  7. 论文阅读 Exploring Temporal Information for Dynamic Network Embedding

    10 Exploring Temporal Information for Dynamic Network Embedding 5 link:https://scholar.google.com.sg ...

  8. UiPath视频教程

    UiPath机器人企业框架简介https://www.bilibili.com/video/BV1SK411L7u9 UiPath借助第三方Pdf软件工作https://www.bilibili.co ...

  9. MYSQL的事务和索引

    事务 什么是事务 事务就是将一组SQL语句放在同一批次内去执行 如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行 MySQL事务处理只支持InnoDB和BDB数据表类型 事务的ACID原则 ...

  10. 训练一个图像分类器demo in PyTorch【学习笔记】

    [学习源]Tutorials > Deep Learning with PyTorch: A 60 Minute Blitz > Training a Classifier   本文相当于 ...