所以我有一个简单的脚本:
using UnityEngine;
public class MyScript: MonoBehaviour
{
public int damage = 25;
public void PrintStuff()
{
Debug.Log("Stuff");
}
}在这个CustomEditor中,我使用Editor.serializedObject
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(MyScript))]
public class LookAtPointEditor : Editor
{
SerializedProperty damageProp;
void OnEnable()
{
// Setup the SerializedProperties.
damageProp = serializedObject.FindProperty("damage");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.IntSlider(damageProp, 0, 100, new GUIContent("Damage"));
serializedObject.ApplyModifiedProperties();
}
}这很好:撤销工作,退出播放模式工作,但我可以使用Editor.target做同样的事情,而且要简单得多。所有功能都可以在Editor.target中正常工作。那么,serializedObject的目的是什么?
发布于 2019-03-06 16:34:23
问得好!Editor API docs解释了这一点,但信息大多是分散的,所以我将总结如下:
首先,有一个您目前不使用的选项CanEditMultipleObjects。文档中的引文:
如果使用这种方法,用户可以在层次结构窗口中选择多个资产,并一次更改所有资产的值。
对于这方面的基本示例,在场景中选择两个GameObjects,它们具有相同的统一组件(如Image或Rigidbody),您将能够同时修改这些组件,使其具有相同的值。大多数内置组件都支持它。
这是使用serializedObject的第一个优点;它支持多对象编辑,而Editor.target不支持(为此需要Editor.targets )。现在,如果您想知道,“为什么我不直接使用Editor.targets进行多对象编辑呢?”请考虑引用文档中的以下内容:
与直接修改脚本变量不同,使用SerializedObject和SerializedProperty系统编辑脚本变量是有利的,因为这会自动处理多对象编辑、撤消和Prefab覆盖。
归根结底,如果您不希望撤消、预置覆盖和多对象编辑功能自动为您处理,只需使用Editor.target或Editor.targets。如果您确实希望这些特性能够自动工作,请使用SerializedObject和SerializedProperty。
https://stackoverflow.com/questions/55027410
复制相似问题