Unity 自定义编辑器预制件显示修改后的值
Unity custom editor prefab show modified values
我有一个预制件,其中包含带有自定义编辑器的脚本。然后在场景中修改预制件,包括脚本本身。
我想要的是将脚本的修改变量加粗,如下所示:
但是,在预制件之外修改的变量看起来就像任何其他(未更改的)变量一样。
我试过使用 Undo.RecordObject
和 EditorUtility.SetDirty
但没有成功。
也许这里有一些我错过的东西,比如我应该叫什么或行的顺序?
我搜索和测试脚本已经好几个小时了,但没有成功,如果有人能告诉我我做错了什么,那就太好了。
编辑器脚本如下所示:
using UnityEditor;
using UnityEngine;
using UnityEditor.SceneManagement;
using UnityEngine.SceneManagement;
[CustomEditor (typeof (MyScript))]
[CanEditMultipleObjects]
public class MyScriptEditor : Editor {
SerializedProperty usePanel, [...], equalHints;
protected virtual void OnEnable () {
setvars ();
}
void setvars () {
usePanel = serializedObject.FindProperty ("usePanel");
// ...and more variables...
equalHints = serializedObject.FindProperty ("equalHints");
MyScript s = (MyScript) target;
Undo.RecordObject (s, "test");
}
public override void OnInspectorGUI () {
if (usePanel.Equals (null)) setvars ();
MyScript s = (MyScript) target;
if (GUI.changed) {
EditorUtility.SetDirty (s); // <--- this was one of my attempts
EditorSceneManager.MarkSceneDirty (SceneManager.GetActiveScene ());
}
usePanel.boolValue = EditorGUILayout.Toggle ("Use Panel", usePanel.boolValue);
// some more lines of code here
if (equalHints.boolValue) {
// do some stuff
}
this.serializedObject.ApplyModifiedProperties ();
}
}
不如直接用一个PropertyField
like
[CustomEditor (typeof (MyScript))]
[CanEditMultipleObjects]
public class MyScriptEditor : Editor
{
SerializedProperty usePanel /*, ... */, equalHints;
protected virtual void OnEnable ()
{
setvars ();
}
void setvars ()
{
usePanel = serializedObject.FindProperty("usePanel");
// ...and more variables...
equalHints = serializedObject.FindProperty("equalHints");
}
public override void OnInspectorGUI ()
{
// don't forget this one
// this gets the current values into the serialized properties
serializedObject.Update();
EditorGUILayout.PropertyField(usePanel);
EditorGUILayout.PropertyField(equalHints);
if (equalHints.boolValue)
{
// do some stuff
}
serializedObject.ApplyModifiedProperties();
}
}
这样 属性 个字段
- 只需根据您的字段类型使用正确的抽屉
- 自动处理脏标记(从而节省 undo/redo)。您无需处理所有脏标记和重做跟踪
我有一个预制件,其中包含带有自定义编辑器的脚本。然后在场景中修改预制件,包括脚本本身。
我想要的是将脚本的修改变量加粗,如下所示:
但是,在预制件之外修改的变量看起来就像任何其他(未更改的)变量一样。
我试过使用 Undo.RecordObject
和 EditorUtility.SetDirty
但没有成功。
也许这里有一些我错过的东西,比如我应该叫什么或行的顺序?
我搜索和测试脚本已经好几个小时了,但没有成功,如果有人能告诉我我做错了什么,那就太好了。
编辑器脚本如下所示:
using UnityEditor;
using UnityEngine;
using UnityEditor.SceneManagement;
using UnityEngine.SceneManagement;
[CustomEditor (typeof (MyScript))]
[CanEditMultipleObjects]
public class MyScriptEditor : Editor {
SerializedProperty usePanel, [...], equalHints;
protected virtual void OnEnable () {
setvars ();
}
void setvars () {
usePanel = serializedObject.FindProperty ("usePanel");
// ...and more variables...
equalHints = serializedObject.FindProperty ("equalHints");
MyScript s = (MyScript) target;
Undo.RecordObject (s, "test");
}
public override void OnInspectorGUI () {
if (usePanel.Equals (null)) setvars ();
MyScript s = (MyScript) target;
if (GUI.changed) {
EditorUtility.SetDirty (s); // <--- this was one of my attempts
EditorSceneManager.MarkSceneDirty (SceneManager.GetActiveScene ());
}
usePanel.boolValue = EditorGUILayout.Toggle ("Use Panel", usePanel.boolValue);
// some more lines of code here
if (equalHints.boolValue) {
// do some stuff
}
this.serializedObject.ApplyModifiedProperties ();
}
}
不如直接用一个PropertyField
like
[CustomEditor (typeof (MyScript))]
[CanEditMultipleObjects]
public class MyScriptEditor : Editor
{
SerializedProperty usePanel /*, ... */, equalHints;
protected virtual void OnEnable ()
{
setvars ();
}
void setvars ()
{
usePanel = serializedObject.FindProperty("usePanel");
// ...and more variables...
equalHints = serializedObject.FindProperty("equalHints");
}
public override void OnInspectorGUI ()
{
// don't forget this one
// this gets the current values into the serialized properties
serializedObject.Update();
EditorGUILayout.PropertyField(usePanel);
EditorGUILayout.PropertyField(equalHints);
if (equalHints.boolValue)
{
// do some stuff
}
serializedObject.ApplyModifiedProperties();
}
}
这样 属性 个字段
- 只需根据您的字段类型使用正确的抽屉
- 自动处理脏标记(从而节省 undo/redo)。您无需处理所有脏标记和重做跟踪