我需要在自定义检查器中序列化一个类(使用可视的编辑器),就像在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中序列化类时那样。
2条答案
按热度按时间rt4zxlrg1#
当你只想展示Unity的一些功能时,你可以使用
EditorGUILayout.PropertyField()
,但是它需要一个SerializedProperty
,你需要从SerializedObject
而不是从实际的目标中获得。您可以将集合(数组、列表等)管理为
SerializedProperty
,但这会增加一些复杂性。https://docs.unity3d.com/ScriptReference/SerializedProperty.htmlhttps://answers.unity.com/questions/682932/using-generic-list-with-serializedproperty-inspect.html显示器
4urapxun2#
只需将您的int myInt设置为public,或添加[SerializeField]属性即可-检查器仅设计用于可序列化字段(在统一编辑器中,公共字段默认为序列化),当前您的myInt是private,因此只能从内部可见
正如h4 i在回答中提到的,在编辑器中显示对象的正确方法是使用SerializedProperty,在开始时转换'target'似乎是一个好主意,但只有当你想在对象上调用方法时才有用,在其他几种情况下它会失败。
您可能需要考虑的是在Editors为单个monobehavior类型提供服务时声明一个PropertyDrawer,PropertyDrawer处理可序列化类的每个示例的显示,并且每次默认编辑器在内部使用PropertyField时都会使用它。