【发布时间】:2022-02-05 02:16:50
【问题描述】:
主要问题是,我正在尝试在 ScriptableObject 中使用多态列表,但在重新启动 Unity 时其内容会丢失;代码如下。
所以我有一个基类:
[Serializable]
public class BaseAction : ScriptableObject
{
public virtual void OnGUI()
{
}
public virtual void ExecuteAction()
{
}
}
还有一个带有简单字符串属性的继承类:
[Serializable]
public class DebugLogAction : BaseAction
{
[SerializeField]
private string debugText = default;
public override void OnGUI()
{
debugText = EditorGUILayout.TextField(debugText);
}
public override void ExecuteAction()
{
Debug.Log(debugText);
}
}
它们都在一个包含 BaseAction 列表的 ScriptableObject 中重新组合:
[Serializable]
[CreateAssetMenu(fileName = "NewActionContainer", menuName = "ScriptableObjects/Action Container")]
public class ActionContainer : ScriptableObject
{
[SerializeField]
private List<BaseAction> actions = default;
public void OnEnable()
{
if (actions == null)
{
actions = new List<BaseAction>();
}
}
public void OnInspectorGUI()
{
foreach (var action in actions)
{
action.OnGUI();
}
if (GUILayout.Button("Add Debug Log Action"))
{
actions.Add(CreateInstance<DebugLogAction>());
}
}
}
我已经为 ActionContainer ScriptableObject 编写了一个自定义编辑器,该编辑器工作正常,显示用于添加多个可编辑输入字段的操作的按钮:
[CustomEditor(typeof(ActionContainer)), CanEditMultipleObjects]
public class CustomActionContainerInspector : Editor
{
private ActionContainer actionContainer;
public void OnEnable()
{
actionContainer = (ActionContainer)target;
}
public override void OnInspectorGUI()
{
actionContainer.OnInspectorGUI();
}
}
但是,在 Unity 重新启动时,ScriptableObject 的内容消失了(程序集重建很好,播放/停止游戏也会保留数据)。
我尝试向 BaseAction 添加一个字段来检查值是否刚刚从继承类中剪掉,但是没有; ActionContainer 中的整个操作列表都清空了。
我认为序列化或反序列化列表本身的元素存在问题,因为它是多态的,但我不知道如何调试或解决问题;互联网搜索也没有让我找到解决方案。
【问题讨论】:
标签: c# unity3d serialization polymorphism