所以我有这个简单的脚本:
using UnityEngine;
public class MyScript: MonoBehaviour
{
public int damage = 25;
public void PrintStuff()
{
Debug.Log("Stuff");
}
}
Run Code Online (Sandbox Code Playgroud)
我使用的这个 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();
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常:撤消事情有效,退出播放模式有效,但我可以使用Editor.target并且更容易做同样的事情。并且所有功能都可以与Editor.target. 那这样做的目的是serializedObject什么?
好问题!在Editor API docs解释这一点,但信息大多是散,所以我会总结一下:
首先,有一个CanEditMultipleObjects您目前没有使用的选项。文档中的引用:
如果使用这种方法,用户可以在层次结构窗口中选择多个资产并一次更改所有资产的值。
作为一个基本示例,GameObjects在场景中选择两个具有相同 Unity 组件(如Image或Rigidbody)的组件,您将能够同时修改这些组件以具有相同的值。大多数内置组件都支持它。
这是使用serializedObject会给你的第一个优势;它支持多对象编辑,Editor.target但不支持(您需Editor.targets要这样做)。所以现在如果你想知道,“为什么我不只是Editor.targets用于多对象编辑? ”考虑一下文档中的引用:
与其直接修改脚本变量,不如使用 SerializedObject 和 SerializedProperty 系统来编辑它们,因为这会自动处理多对象编辑、撤消和预制覆盖。
这归结为,如果您不想为您自动处理撤消、预制覆盖和多对象编辑功能,只需使用Editor.target或Editor.targets。如果您确实希望这些功能自动运行,请使用SerializedObject和SerializedProperty。
| 归档时间: |
|
| 查看次数: |
1567 次 |
| 最近记录: |