Unity 获取 [序列化字段] 私有变量以显示在我的自定义编辑器中

本文关键字:显示 我的 自定义 编辑器 变量 获取 序列化 字段 Unity | 更新日期: 2023-09-27 18:34:28

我很难弄清楚如何通过我创建的编辑器让我的[SerializeField]私有布尔变量显示在检查器中。 我通常会做这样的事情:

myTarget.AutoFill = EditorGUILayout.Toggle(...)

如果变量是公共的,但由于我将其作为"私有",我是否失去了在Options_Manager_Editor中使用它的机会? 既然我想保留封装,有没有办法解决这个问题? 我是否必须更改为使用 OnGUI ,只是将其公开,因为需要另一个脚本,或者在我的Options_Manager中创建一个公共方法,其中包含用于自定义检查器的布尔AutoFill的代码?

我的Options_Manager代码:

public class Options_Manager : MonoBehaviour {
    // Auto fill.
    [SerializeField] 
    private bool AutoFill;
}

我的Options_Manager_Editor代码:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEditor;
[CanEditMultipleObjects]
[CustomEditor(typeof(Options_Manager))]
public class Options_Manager_Editor : Editor {
    public override void OnInspectorGUI(){
        // Grab the script.
        Options_Manager myTarget = target as Options_Manager;
        // Set the indentLevel to 0 as default (no indent).
        EditorGUI.indentLevel = 0;
        // Update
        serializedObject.Update();
        EditorGUILayout.Toggle(new GUIContent("Test Fill", "Test Fill Tooltip."), serializedObject.FindProperty("AutoFill").boolValue);
        // Apply
        serializedObject.ApplyModifiedProperties();
    }
}

编辑:我最近刚刚尝试了一些东西,但我不确定这是否会导致任何问题,但如果有人可以看看这个并让我知道那会很棒。

我的Options_Manager代码:

public class Options_Manager : MonoBehaviour {
    // Auto fill.
    [SerializeField] 
    private bool _autoFill;
public bool AutoFill{
    get{
        return _autoFill;
    }
    set{
        _autoFill = value;
    }
}
}

我的Options_Manager_Editor代码:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEditor;
[CanEditMultipleObjects]
[CustomEditor(typeof(Options_Manager))]
public class Options_Manager_Editor : Editor {
    public override void OnInspectorGUI(){
        // Grab the script.
        Options_Manager myTarget = target as Options_Manager;
        // Set the indentLevel to 0 as default (no indent).
        EditorGUI.indentLevel = 0;
        // Update
        serializedObject.Update();
        myTarget.AutoFill = EditorGUILayout.Toggle(new GUIContent("Auto Fill", "Test Tooltip"), serializedObject.FindProperty("_autoFill").boolValue);
        // Apply
        serializedObject.ApplyModifiedProperties();
    }
}

Unity 获取 [序列化字段] 私有变量以显示在我的自定义编辑器中

MyProjectNamespace.cs

using UnityEngine;
using UnityEditor;
namespace MyProjectNamespace
{
    [ CustomEditor( typeof( MyMonoBehaviour ) ) ]
    [ CanEditMultipleObjects ]
    public class MyMonoBehaviourInspector : Editor
    {
        #region Variables
        SerializedProperty _myBoolSP;
        MyMonoBehaviour _myMonoBehaviour;
        #endregion Variables
        #region Functions
        void OnEnable()
        {
            _myMonoBehaviour = serializedObject.targetObject as MyMonoBehaviour;
            _myBoolSP = serializedObject.FindProperty( "_myClass._myBool" );
            Debug.Log( "_myBoolSP = " + _myBoolSP.boolValue );
        }

        public override void OnInspectorGUI()
        {
            serializedObject.Update();
            _myBoolSP.boolValue = EditorGUILayout.Toggle( "A Boolean", _myBoolSP.boolValue );
            GUILayout.Label( _myMonoBehaviour.MyBoolValue() );
            serializedObject.ApplyModifiedProperties();
        }
        #endregion Functions
    }
}

我的单体行为.cs

using UnityEngine;
namespace MyProjectNamespace
{
    public class MyMonoBehaviour : MonoBehaviour
    {
        #region Variables
        [ SerializeField ] private MyClass _myClass;
        #endregion Variables
        #region Functions
        public string MyBoolValue()
        {
            return "The value of _myBool is " + _myClass.MyBool;
        }
        #endregion Functions
    }
}

我的班级.cs

using UnityEngine;
namespace MyProjectNamespace
{
    [ System.Serializable ]
    public class MyClass
    {
        #region Variables
        [ SerializeField ] private bool _myBool;
        #endregion Variables
        #region Functions
        public bool MyBool
        {
            get{ return _myBool; }
        }
        #endregion Functions
    }
}

供将来参考。请注意,你可以有私有变量,你只需要使用 [ SerializeField ] ,(对于不扩展 MonoBehavior 的类,[ System.Serializable ](。编辑器类可能不需要using UnityEngine.UI