Unity 自定义Inspector面板时的数据持久化问题

自定义Inspector面板的步骤:

  1. Unity内创建自定义的Inspector需要在Asset的任意文件夹下创建一个名字是Editor的文件夹,随后这个文件夹内的cs文件就会被放在vstu生成的Editor程序集里。
  2. 自定义Inspector需要创建一个继承自UnityEditor.Editor的类,并且提供一个[CustomEditor(typeof(Behavior))]类特性标记,其中Behaviour就是要自定义观察器的目标组件类型。
  3. 然后在Editor派生类里实现OnInspectorGUI方法,可以使用GUILayout,GUI,EditorGUILayout,EditorGUI的静态方法进行界面绘制。
  4. 如果要在自定义的部分后面显示默认Inspector内容的话,在方法结尾调用一次DrawDefaultInspector();

观察目标的数据持久化问题:

  被观察的目标Prefab上或者场景内对象上挂载的MonoBehavior继承自UnityEngine.Object,支持持久化自身数据,默认会持久化所有public的成员变量。而派生自Editor的自定义Inspector则不适合用来存储数据,因为同一Inspector是可以用来查看不同MonoBehavior实例的。因此需要保存下来的数据,比如自定义Inspector里才显示的文本字段,数组,都应该放进MonoBehaviour,然后定为public访问权限,加上[HideInInspector]标记。

  这里我掉了个坑,在自定义的Inspector里通过target字段来读写MonoBehaviour成员是不会自动持久化的,需要在Editor派生类 (也就是控制自定义Inspector显示的类里)对需要操作的每个成员变量定义一个SerializedProperty类型的属性封装对象。然后用类似以下的方式获取属性实例,这里m_exportPath是被观察MonoBehaviour的字段:

exportPath = serializedObject.FindProperty("m_exportPath");

  serializadObject是Inspector的只读属性,表示target的序列化后数据。在OnInspectorGUI虚方法实现里,第一句最好就是

serializedObject.Update();

  这样是更新target数据到序列化后数据,然后在方法最后调用:

serializedObject.ApplyModifiedProperties();

  如果需要DrawDefaultInspector(); 必须放在 serializedObject.ApplyModifiedProperties(); 之后。

 

参考文章:

Unity Editor 基础篇(二):自定义 Inspector 面板:

https://gameinstitute.qq.com/community/detail/117632

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fancybit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值