代码之家  ›  专栏  ›  技术社区  ›  kiyah

Unity自定义编辑器预设显示修改的值

  •  0
  • kiyah  · 技术社区  · 4 年前

    我有一个预置,包含一个自定义编辑器脚本。然后在场景中修改预置,包括脚本本身。

    bold variable

    但是,在预置之外修改的变量看起来就像其他变量一样。 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 ();
        }
    }
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   derHugo    4 年前

    直接使用 PropertyField

    [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();
        }
    }
    

    这样属性字段

    • 只需根据您的字段类型使用正确的抽屉
    • 自动处理标记脏(从而保存和撤消/重做)。你不需要处理所有的脏标记和重做跟踪