方法
public override void OnInspectorGUI()
{
EditorGUI.BeginChangeCheck();
if (EditorGUI.EndChangeCheck())
{
}
}
效果
- 对用户手动在 Inspector 上造成的改变,发生响应;
- 若其他脚本修改了该脚本的变量,使其在 Inspector 上造成改变,则不发生响应。
至于为何会产生该效果,我手动实现了一下,参考下列等效代码。
等效示例
protected SerializedProperty count;
protected virtual void OnEnable()
{
count = serializedObject.FindProperty("_count");
}
public override void OnInspectorGUI()
{
int countValue = count.intValue;
EditorGUILayout.PropertyField(count, new GUIContent("Count", ""));
if (countValue != count.intValue)
{
}
}
提前应用修改
假设上例中的 count 属性在 Runtime 脚本(即继承了 MonoBehavior 而非 Editor 的脚本)中是这样定义的:
public int count
{
get => _count;
set => _count = Mathf.Max(0, value);
}
[SerializeField]
protected int _count = 0;
则可以利用其 Setter 提前应用修改,如下:
public override void OnInspectorGUI()
{
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(count, new GUIContent("Count", ""));
if (EditorGUI.EndChangeCheck())
{
((ExampleScript)target).count = count.intValue;
}
}
|