Unity 自定义Inspector面板时的数据持久化问题
自定义Inspector面板的步骤:
- Unity内创建自定义的Inspector需要在Asset的任意文件夹下创建一个名字是Editor的文件夹,随后这个文件夹内的cs文件就会被放在vstu生成的Editor程序集里。
- 自定义Inspector需要创建一个继承自UnityEditor.Editor的类,并且提供一个[CustomEditor(typeof(Behavior))]类特性标记,其中Behaviour就是要自定义观察器的目标组件类型。
- 然后在Editor派生类里实现OnInspectorGUI方法,可以使用GUILayout,GUI,EditorGUILayout,EditorGUI的静态方法进行界面绘制。
- 如果要在自定义的部分后面显示默认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
Unity 自定义Inspector面板时的数据持久化问题的更多相关文章
- 让Unity的Inspector面板支持字符限制(restrict)功能
今天在优化红点组件,笔者打算将红点id由10进制改为16进制处理,就打算将红点id字段由uint类型改成string类型,用于填写16进制的字符(因为在Inspector面板里,uint/int类型字 ...
- unity自定义菜单面板开发
using UnityEditor;using UnityEngine;using CreateTerrainDLL; public class CreateTerrainMenu : EditorW ...
- Unity 在Inspector面板,脚本前面的激活对勾
写个脚本,把它挂在一个游戏对象上: using System.Collections; using System.Collections.Generic; using UnityEngine; pub ...
- 自定义Inspector检视面板
Unity中的Inspector面板可以显示的属性包括以下两类:(1)C#以及Unity提供的基础类型:(2)自定义类型,并使用[System.Serializable]关键字序列化,比如: [Sys ...
- Unity编辑器重写Inspector面板,面板中编辑的数据不触发场景发生变化的问题。
今天开始协助主程一起制作新框架.主程让我写关于新版UI框架注册UI预制体用的快捷编辑器. 现学现写,总算完成了. 可以直接把选中的预制体添加到UIController的数组中,期间涉及到改变大小.所以 ...
- Unity C#数据持久化与xml
最近工作需要用到数据持久化,所以在此分享一下,通过查阅资料,数据持久化大体都是通过xml或者json来进行的.unity为我们自定义了数据持久化方法,但是比较局限,还需要自己来完成数据持久化方法. ( ...
- 使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法
使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法 效果展示 一个很简单的组件脚本 运行状态在Inspector面板可以随便修改字段和调用方法 方法调用日志 设计由来 最近在 ...
- Unity编辑器环境在Inspector面板中显示变量
Serialize功能Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示,并且定义Serialize关系. 简单的说,在没有自定义Inspector的情况下所有 ...
- iOS数据持久化-OC
沙盒详解 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文 ...
随机推荐
- java ServletContextListener 实现UDP监听
使用spring boot实现项目启动时的监听, UDPListener import java.io.IOException;import java.io.UnsupportedEncodingEx ...
- HashMap源码__tableSizeFor方法解析
tableSizeFor(int cap)方法返回不小于指定参数cap的最小2的整数次幂,具体是怎么实现的呢?看源码! /** * Returns a power of two size for th ...
- [小米OJ] 8. 最少交换次数
求逆序对数即可 function solution(line) { var nums = line.split(","); var res = 0; for (let i = 0; ...
- z-index不起作用
摘录自 https://blog.csdn.net/apple_01150525/article/details/76546367 z-index无效的情况,一共有三种:1.父标签 position属 ...
- Face++实习体验
旷视Face++ 实习体验 已经在Face++呆了快20天了,自从实习,github和blog也碰的少了,我工作是做聚类(也是头一次接触机器学习,以前想都没敢想的),毕竟工作内容很多都是不熟悉的,需要 ...
- 单调栈&单调队列
最近打了三场比赛疯狂碰到单调栈和单调队列的题目,第一,二两场每场各一个单调栈,第三场就碰到单调队列了.于是乎就查各种博客,找单调栈,单调队列的模板题去做,搞着搞着发现其实这两个其实是一回事,只不过利用 ...
- python模块知识二 random -- 随机模块、序列化 、os模块、sys -- 系统模块
4.random -- 随机模块 a-z:97 ~ 122 A-Z :65 ~ 90 import random #浮点数 print(random.random())#0~1,不可指定 print( ...
- 浅谈设计模式及python实现
设计模式及Python实现 设计模式是什么? Christopher Alexander:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样你就能一次又一次地使用 ...
- SCI论文的时态
如果有的杂志对时态有要求,则以下所述都没有用了. 有些杂志也会专门有些比较“特别”的要求,比如Cell,要求Abstract全部使用一般现在时. 英语谓语动词时态共有16种,在英文科技论文中用得较为频 ...
- 5.源码分析---SOFARPC调用服务
我们这一次来接着上一篇文章<4. 源码分析---SOFARPC服务端暴露>讲一下服务暴露之后被客户端调用之后服务端是怎么返回数据的. 示例我们还是和上篇文章一样使用一样的bolt协议来讲: ...