从2017开始,在editor脚本中查找属性是这样写的 var m_Script = serializedObject.FindProperty("m_Script");

SerializedProperty

以UGUI的源码为例

using UnityEngine;
using UnityEngine.UI;
using UnityEditor.AnimatedValues; namespace UnityEditor.UI
{
[CustomEditor(typeof(Selectable), true)]
/// <summary>
/// Custom Editor for the Selectable Component.
/// Extend this class to write a custom editor for an Selectable-derived component.
/// </summary>
public class SelectableEditor : Editor
{
protected virtual void OnEnable()
{
SerializedProperty m_Script = serializedObject.FindProperty("m_Script");
SerializedProperty m_InteractableProperty = serializedObject.FindProperty("m_Interactable");
}
}
}

直接修改

而我在unity4.x时,查找某个属性是这样写的,我在Unity2019和Unity2020中测试目前这种写法还是生效的

using UnityEditor;
using UnityEngine; [CustomEditor(typeof(MyActor))]
public class MyActorInspector : Editor
{
public int ATKProp; void OnEnable()
{
MyActor myActor = target as MyActor; //类型转换为MyActor
ATKProp = myActor.ATK;//缓存对象的某个字段和属性
} public override void OnInspectorGUI()
{
ATKProp = EditorGUILayout.IntSlider("ATK", ATKProp, 0, 100);
}
}

这两种写法有什么区别呢?

serializedObject.FindProperty可以修改private的值,而直接修改只能访问public的值

SerializedProperty被编辑的对象需要加上[Serializable]标签,且要找的属性如果是private需要加上[SerializeField]标签,否则序列化会报错

SerializedProperty写法的值在编辑过程中可以撤消(Undo)、Prefab overrides,而直接修改无法撤消,就是按Ctrl+Z无效,所以建议平时还是使用FindProperty开发。

SerializedProperty中指向当前对象叫 serializedObject ,在直接写叫 target

SerializedProperty文档:https://docs.unity.cn/cn/current/ScriptReference/SerializedObject.html

在官网文档中也有提到这两种写法的区别:https://docs.unity.cn/cn/current/ScriptReference/Editor.html

SerializedProperty文档

// 更新序列化属性,写在OnInspectorGUI的开头
serializedObject.Update (); //对序列化属性修改后,需要应用修改才能保存序列化数据,要写在OnInspectorGUI方法的结尾
serializedObject.ApplyModifiedProperties ();

遇到问题

serializedObject复选框无法勾选

比如下面这段代码就会让复选框无法操作

protected override void OnEnable()
{
base.OnEnable();
UseLangId = serializedObject.FindProperty("useLangId");
} public override void OnInspectorGUI()
{
EditorGUILayout.PropertyField(UseLangId,"使用语言包"); //这样会导致Inspector的复选框,无法勾选和取消
serializedObject.Update();//NOTE 这句要放在最前面,否则无法操作复选框
serializedObject.ApplyModifiedProperties();
base.OnInspectorGUI();
}

EditorGUI.indentLevel是什么意思?

增加缩进深度,就是在这个属性的开头会有空格,需要配套出现,示例如下:

++EditorGUI.indentLevel;
for (int i = 0; i < paramArr.arraySize; i++)
{
paramArr.GetArrayElementAtIndex(i).stringValue = EditorGUILayout.TextField(paramArr.GetArrayElementAtIndex(i).stringValue);
args[i] = paramArr.GetArrayElementAtIndex(i).stringValue;
}
--EditorGUI.indentLevel;

Unity Editor开发中查找属性的两种写法对比的更多相关文章

  1. [spring]xml配置文件中bean属性的两种写法(p:configLocation <=> <property name="configLocation"/>)

    1.当作bean节点的属性:p:configLocation: <!-- mybatis文件配置,扫描所有mapper文件 --> <bean id="sqlSession ...

  2. Hive开发中使用变量的两种方法

    在使用hive开发数据分析代码时,经常会遇到需要改变运行参数的情况,比如select语句中对日期字段值的设定,可能不同时间想要看不同日期的数据,这就需要能动态改变日期的值.如果开发量较大.参数多的话, ...

  3. IOS开发中数据持久化的几种方法--NSUserDefaults

    IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...

  4. Java中Compareable和Comparator两种比较器的区别

    Java中Compareable和Comparator两种比较器的区别 参考原文链接:https://www.cnblogs.com/ldy-blogs/p/8488138.html 1.引言 在ja ...

  5. spring配置属性的两种方式

    spring配置属性有两种方式,第一种方式通过context命名空间中的property-placeholder标签 <context:property-placeholder location ...

  6. web.config文件中配置数据库连接的两种方式

    web.config文件中配置数据库连接的两种方式 标签: 数据库webconfig 2015-04-28 18:18 31590人阅读 评论(1)收藏举报    分类: 数据库(74)  在网站开发 ...

  7. MySQL中MyISAM和InnoDB两种主流存储引擎的特点

    一.数据库引擎(Engines)的概念 MySQ5.6L的架构图: MySQL的存储引擎全称为(Pluggable Storage Engines)插件式存储引擎.MySQL的所有逻辑概念,包括SQL ...

  8. 在Android开发中,定时执行任务的3种实现方法

    在Android开发中,定时执行任务的3种实现方法: 一.采用Handler与线程的sleep(long)方法(不建议使用,Java的实现方式)二.采用Handler的postDelayed(Runn ...

  9. LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...

  10. Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数A ...

随机推荐

  1. Unable to find @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest

    test下的包名和java下的包名不一致会产生下面错误 java.lang.IllegalStateException: Unable to find a @SpringBootConfigurati ...

  2. Axure RP 9 下载、破解激活教程、最新激活码,亲测可用

    本教程适用于 Axure RP 9 Enterprise/Pro/Team 的激活.破解,最新激活码,适用于 windows, mac系统,仅用于学习 简介 Axure RP 9.0 破解版是一款功能 ...

  3. stm32f103 rt-thread fal easyflash移植过程

    需求:使用Stm32F103片内Flash进行数据存储 硬件平台:Stm32F103C8t6(由于Stm32F103C8t6的Flash标注为64k实际为128K,64KFlash在使用rt-thre ...

  4. 字符串匹配算法:Horspool算法

    Horspool 字符串匹配算法对Boyer-Moore算法的简化算法. Horspool 算法是一种基于后缀匹配的方法,是一种"跳跃式"匹配算法,具有sub-linear亚线性时 ...

  5. 元素scroll系列属性

    scroll翻译过来,就是滚动的,我们使用scroll系列的相关属性可以动态的得到该元素的大小.滚动距离等. scroll系列属性 作用 element.scrollTop 返回被卷上去的上侧距离,返 ...

  6. shell 编程中 awk ,wc ,$0,$1 等 命令的使用总结

    本文为博主原创,转载请注明出处: 1. awk 的常用场景总结 2. wc 常用场景总结 3. $0,$1,$# 的使用总结 4. seq 的使用总结 5. 获取用户输入 read 使用 1. awk ...

  7. Java21 + SpringBoot3集成easy-captcha实现验证码显示和登录校验

    目录 前言 相关技术简介 easy-captcha 实现步骤 引入maven依赖 定义实体类 定义登录服务类 定义登录控制器 前端登录页面实现 测试和验证 总结 附录 使用Session缓存验证码 前 ...

  8. MongoDB 部署副本集 + 代码中开启事务

    首先,指定副本名称: vim /etc/mongod.conf replication: replSetName: shard1 在replication里面加入副本名称,多个相同副本,应该使用同样的 ...

  9. sql server 数据恢复

    1) 备份当前数据库的事务日志:BACKUP LOG [数据库名] TO disk= N'备份文件名' WITH NORECOVERY 2) 恢复一个误删除之前的完全备份:RESTORE DATABA ...

  10. mongo环境搭建

    安装 mongoDB mongo下载 添加 MONGOROOT/bin 到环境变量 PATH MONGOROOT是mongo安装目录 启动 mongo 服务启动程序 MONGOROOT/bin/mon ...