经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
Unity Editor开发中查找属性的两种写法对比
来源:cnblogs  作者:赵青青  时间:2021/5/31 8:52:33  对本文有异议

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

SerializedProperty

以UGUI的源码为例

  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using UnityEditor.AnimatedValues;
  4. namespace UnityEditor.UI
  5. {
  6. [CustomEditor(typeof(Selectable), true)]
  7. /// <summary>
  8. /// Custom Editor for the Selectable Component.
  9. /// Extend this class to write a custom editor for an Selectable-derived component.
  10. /// </summary>
  11. public class SelectableEditor : Editor
  12. {
  13. protected virtual void OnEnable()
  14. {
  15. SerializedProperty m_Script = serializedObject.FindProperty("m_Script");
  16. SerializedProperty m_InteractableProperty = serializedObject.FindProperty("m_Interactable");
  17. }
  18. }
  19. }

直接修改

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

  1. using UnityEditor;
  2. using UnityEngine;
  3. [CustomEditor(typeof(MyActor))]
  4. public class MyActorInspector : Editor
  5. {
  6. public int ATKProp;
  7. void OnEnable()
  8. {
  9. MyActor myActor = target as MyActor; //类型转换为MyActor
  10. ATKProp = myActor.ATK;//缓存对象的某个字段和属性
  11. }
  12. public override void OnInspectorGUI()
  13. {
  14. ATKProp = EditorGUILayout.IntSlider("ATK", ATKProp, 0, 100);
  15. }
  16. }

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

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文档

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

遇到问题

serializedObject复选框无法勾选

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

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

EditorGUI.indentLevel是什么意思?

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

  1. ++EditorGUI.indentLevel;
  2. for (int i = 0; i < paramArr.arraySize; i++)
  3. {
  4. paramArr.GetArrayElementAtIndex(i).stringValue = EditorGUILayout.TextField(paramArr.GetArrayElementAtIndex(i).stringValue);
  5. args[i] = paramArr.GetArrayElementAtIndex(i).stringValue;
  6. }
  7. --EditorGUI.indentLevel;

原文链接:http://www.cnblogs.com/zhaoqingqing/p/14825879.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号