首页 > 解决方案 > 可序列化类未显示在自定义检查器中

问题描述

我正在统一为我的 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#classunity3dserializationeditor

解决方案


这个对我有用

我的课:

[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”的文件夹中


推荐阅读