【问题标题】:Serializable class is not shown in custom inspector可序列化类未显示在自定义检查器中
【发布时间】:2019-01-23 19:03:55
【问题描述】:

我正在统一为我的 ScriptableObjects 创建自定义检查器,我注意到我的 Serializable 类的属性没有显示

我创建了一个简单的脚本来保存字符数据,其中一个字段是 Serializable 类。如果我不使用自定义检查器,我可以在检查器中看到该类,但如果我尝试创建一个,它只会在折叠视图中自动显示字段名称,当我展开它时,它是空的。

我的班级:

using UnityEngine;
[System.Serializable]
public class Skills
{
    [SerializeField, Tooltip("This character agility level")]
    private byte agility, strength;

}

我的数据脚本对象:

using UnityEngine;
using Weapons.ScriptableObjects;
namespace Characters.ScriptableObjects
{
     [CreateAssetMenu(fileName = "New Character", menuName 
"Characters/Soldier")]
    public class SoldierData : CharacterData
    {
        public Weapon weapon;
        public float life = 100;
        public bool autoAttack = true;
        public Skills skills = new Skills();
    }
}

最后是我的自定义编辑器:

using UnityEditor;
namespace Characters.CustomEditors
{
    [CustomEditor(typeof(ScriptableObjects.SoldierData))]
    public class SoldierEditor : CharacterEditor
    {
        private SerializedProperty life, autoAttack, skills, weapon;
        private bool showBaseProperties = true, showWeaponProperties = false;

        private new void OnEnable()
        {
            base.OnEnable();
            life = serializedObject.FindProperty("life");
            autoAttack = serializedObject.FindProperty("autoAttack");
            skills = serializedObject.FindProperty("skills");
            weapon = serializedObject.FindProperty("weapon");
        }
        public override void OnInspectorGUI()
        {
            showBaseProperties = EditorGUILayout.Foldout(showBaseProperties, "Basic settings:");
            if (showBaseProperties)
            {
                base.OnInspectorGUI();
            }
            serializedObject.Update();
            showWeaponProperties = EditorGUILayout.Foldout(showWeaponProperties, "Weapon settings");
            if (showWeaponProperties)
            {
                EditorGUILayout.PropertyField(autoAttack);
                EditorGUILayout.PropertyField(life);
            }
            EditorGUILayout.PropertyField(skills);
            serializedObject.ApplyModifiedProperties();
            }
        }
    }

我想在自定义检查器中查看我的技能类的属性

【问题讨论】:

    标签: c# class unity3d serialization editor


    【解决方案1】:

    对我有用

    我的班级:

    [Serializable]
    public class Skills
    {
        [SerializeField]
        public byte[] m_Arr;
    }
    

    我的数据脚本对象:

    [CreateAssetMenu(fileName = "New Character", menuName =
    "Characters/Soldier")]
    public class SoldierData : ScriptableObject
    {
        //public Weapon weapon;
        public float life = 100;
        public bool autoAttack = true;
        public Skills skills = new Skills();
    }
    

    最后是我的自定义编辑器:

    [CustomEditor(typeof(SoldierData))]
    public class SoldierEditor : Editor
    {
        private SerializedProperty life, autoAttack, skills/*, weapon*/;
        private bool showBaseProperties = true, showWeaponProperties = false;
    
        private void OnEnable()
        {
            life = serializedObject.FindProperty("life");
            autoAttack = serializedObject.FindProperty("autoAttack");
            skills = serializedObject.FindProperty("skills");
            //weapon = serializedObject.FindProperty("weapon");
        }
        public override void OnInspectorGUI()
        {
            showBaseProperties = EditorGUILayout.Foldout(showBaseProperties, "Basic settings:");
            if (showBaseProperties)
            {
                base.OnInspectorGUI();
            }
            serializedObject.Update();
            showWeaponProperties = EditorGUILayout.Foldout(showWeaponProperties, "Weapon settings");
            if (showWeaponProperties)
            {
                EditorGUILayout.PropertyField(autoAttack);
                EditorGUILayout.PropertyField(life);
            }
            EditorGUILayout.PropertyField(skills);
            serializedObject.ApplyModifiedProperties();
        }
    }
    

    取消注释武器 添加:将SoldierEditor放入名为“Editor”的文件夹中

    【讨论】:

    • 我得到了相同的结果....除了 byte[] m_Arr; 还有其他区别吗?
    • 哦,对不起,我陷害了。您可以在那里替换任何可序列化的值。主要是该字段是公开的,我还更正了“SoldierEditor:Editor”并将这个脚本放在一个名为“Editor”的文件夹中我会补充说,如果你想在检查器中看到 Weapon 类,那么你还需要使其可序列化。
    • 如果使用[SerializeField],该字段不必是public。或者反过来:如果一个字段是public,它无论如何都会被序列化并且不需要[SerializeField]
    • @derHugo 是的,([SerializeField] whith public)它是冗余的。 link
    猜你喜欢
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2019-07-12
    • 2022-11-04
    • 1970-01-01
    • 2017-11-15
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多