Unity 自定义编辑器窗口的使用

Unity 自定义编辑器窗口功能强大,可以实现所有希望实现的功能。我在近期的项目中仿照魔兽争霸3开发了一套简单的游戏单位功能组件,其中包括单位数据、移动方式、动画播放、武器系统等等。如果用传统的Inspector来修改各项属性十分不方便,所以实现一个简单直观的自定义编辑器窗口来进行属性管理成了一个很好的选择。

创建自定义编辑器窗口并将每一项属性显示出来是十分简单的,我们只需要通过Selection.activeGameObject 来获取当前选中的物体,并在从该物体上获取相关的脚本就可以进行属性的读取。但是,如何将修改后的属性传递回指定物体并保存起来呢?

我的第一想法是通过直接访问物体上的脚本这种方法来赋值,下面将举一个简单的例子。

假设我的单位系统的移动组件命名为 MovementController 其中speed属性为移动速度,我在自定义窗口的类中写如下代码:

MovementController mc = Selection.activeGameObject.GetComponent<MovementController>();
if (mc != null) 
{
    mc.speed = EditorGUILayout.FloatField(new GUIContent("Speed"), mc.speed);
}

这些代码完成了获取组件和赋值的功能,那么它的问题在哪里呢?

使用这些代码之后,在自定义窗口中进行Speed属性的修改的确是可以影响到物体上的MovementController 组件的。而且,在修改后立刻进入编辑器的播放模式是可以看出修改效果的。但是这次修改作用的时间也仅仅是当前场景打开的这段时间,一旦你切换场景或是关闭了Unity Editor,所有所做的修改全部会丢失。

究其原因,我们这次修改的是当前场景打开后在内存中保存的实例属性,并不是保存在硬盘上的场景数据。所以在我们切换场景或是关闭Editor后,随着内存的清理,所有修改过的数据也全部一起丢失了。

那么,怎样才能算是成功修改到硬盘上的数据,或是通知Editor需要更新硬盘上的数据了呢?

可能细心的朋友会注意到,如果通过Inspector视图进行场景内某一物体的属性修改,修改完成后会发现Editor的标题栏会多出一个”*” 来提示用户当前场景有未保存的数据。如果这时用户保存了当前场景,那么这个“*”会消失,说明变动已经保存到硬盘。以此为背景,我们刚刚使用的方法在修改后可以看到Inspector中的对应属性变化,但是在Editor的标题栏上并不会出现”*”,这也从侧面说明Editor并没有认为这是一次修改,而修改的也仅仅是内存中的实例。

这里要引入一个名为“序列化”的概念。序列化 (Serialization)是指将对象的状态信息转换为可以存储或传输的形式的过程。可能只看定义会有些难以理解,简单来说就是将内存中的数据转化为能够保存到硬盘上的形式。用这句话来解释也是因为它可以和前面所说的内容对应。前面出现的问题是我修改的仅仅是内存中的数据,而我需要把这个数据转化并存储到硬盘上,所以序列化就是最好的解决方法。

还用刚才的那个例子,使用序列化方法的代码如下:

SerializedObject mc = new SerializedObject(Selection.activeGameObject.GetComponent<MovementController>());

SerializedProperty PropSpeed = mc.FindProperty("speed");

PropSpeed.floatValue = EditorGUILayout.FloatField(new GUIContent("Speed"), PropSpeed.floatValue);

mc.ApplyModifiedProperties();

这段代码实现的功能依旧是修改speed属性,但是与前一个方法不同的地方在于,它并不是直接对内存中的实例进行修改,而是向将该实例进行序列化处理,将它处理为一个SerializedObject,这也就是将其转化为可以存储到硬盘上的状态。再从SerializedObject上获取SerializedProperty并对SerializedProperty进行修改,就可以保证我们所修改的值是可以存储到硬盘上的那一部分。最后一句ApplyModifiedProperties 这个函数的功能就像它的名字一样——应用修改后的属性。它做的除了将修改后的值同步到实例,也通知Editor 这个实例进行过修改,需要保存才能保证修改后的属性不会丢失。

使用后面这种方法后,在自定义编辑器窗口对Speed属性进行修改时,会发现Editor的标题栏出现了”*”符号,说明我们的修改生效了,并且可以通过保存行为将修改后的数据保存到硬盘中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值