unity3d 在Unity的自定义检查器中序列化自定义类

s5a0g9ez  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(316)

我需要在自定义检查器中序列化一个类(使用可视的编辑器),就像在Monobhavior脚本中所做的那样,如下所示:
第一个
其给出了以下结果:result wanted and given using the code above, where DamageEffect = CustomClass and Damage = myInt
在我的自定义编辑器中,我希望这样:

[CustomEditor(typeof(CardObject))]
class AnotherClassEditor : Editor
{
    public override void OnInspectorGUI()
    {
        [SerializeField] CustomClass customclass;                        
    }
}

但是,正如预期的那样,它指出了一个错误。
我也尝试过EditorGUILayout.ObjectField(),但我还没有能够,我不是那么有经验,所以请尽量保持简单的答案。
实际上,我需要这种序列化只在枚举等于某个值时发生,整个脚本如下所示:

using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

[CreateAssetMenu(fileName = "Card", menuName = "CardObject")]
public class CardObject : ScriptableObject
{
    public List<CardEffectType> effectsTypes;
    //other...
    [HideInInspector] public List<CardEffect> effects;

    //other...
}

#if UNITY_EDITOR
[CustomEditor(typeof(CardObject))]
class CardObjectEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        CardObject cardObject = (CardObject)target;

        foreach(CardEffectType effectType in cardObject.effectsTypes)
        {
            switch (effectType)
            {
                case CardEffectType.DamageEffect:
                    {
                        //!!!
                    }
            }
        }
    }
}
#endif

public enum CardEffectType
{
    DamageEffect, //other...
}

我找到了一些变通方法,但结果并不像在Monobhavior中序列化类时那样。

rt4zxlrg

rt4zxlrg1#

当你只想展示Unity的一些功能时,你可以使用EditorGUILayout.PropertyField(),但是它需要一个SerializedProperty,你需要从SerializedObject而不是从实际的目标中获得。

[CustomEditor(typeof(MyType))]
public class MyTypeEditor : Editor
{
    private SerializedProperty _variableIWantToShow;

    private void OnEnable()
    {
        _variableIWantToShow = serializedObject.FindProperty("<name-of-the-variable>");
    }

    public override void OnInspectorGUI()
    {
        // ...
        if (ShowVariable) EditorGUILayout.PropertyField(_variableIWantToShow);
        // ...
    }
}

您可以将集合(数组、列表等)管理为SerializedProperty,但这会增加一些复杂性。
https://docs.unity3d.com/ScriptReference/SerializedProperty.htmlhttps://answers.unity.com/questions/682932/using-generic-list-with-serializedproperty-inspect.html显示器

4urapxun

4urapxun2#

只需将您的int myInt设置为public,或添加[SerializeField]属性即可-检查器仅设计用于可序列化字段(在统一编辑器中,公共字段默认为序列化),当前您的myInt是private,因此只能从内部可见
正如h4 i在回答中提到的,在编辑器中显示对象的正确方法是使用SerializedProperty,在开始时转换'target'似乎是一个好主意,但只有当你想在对象上调用方法时才有用,在其他几种情况下它会失败。
您可能需要考虑的是在Editors为单个monobehavior类型提供服务时声明一个PropertyDrawer,PropertyDrawer处理可序列化类的每个示例的显示,并且每次默认编辑器在内部使用PropertyField时都会使用它。

相关问题