这两天在做技能系统的数据编辑器,然后出现了不管怎样做都无法保存在 XNode 里修改后数据这个鬼畜的问题,然后死磕了一天,直接自己写了一个序列化的面板… 但是找到了问题所在 举个栗子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using NaughtyAttributes;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

namespace SolvargSkill
{
[CreateNodeMenu("触发条件/")]
public class SFAction_ConditionActionNode : SFAction_BaseNode
{
[AllowNesting]
[Label("跳转状态名")]
public string stateName;
[AllowNesting]
[Label("优先级")]
public int priority;

public List<SFAction_Condition> checker;

public override SF_NodeType GetNodeType => SF_NodeType.Condition;
}

[Serializable]
public class SFAction_Condition
{
[AllowNesting]
[Label("条件类型")]
[OnValueChanged("ResetCondition")]
public SFAction_ConditionType cType;

public SFAction_ConditionType CType
{
set
{
if (value != cType)
{
cType = value;
ResetCondition();
}
}
}

public ActionConditionBase condition;

public Type GetConditionType()
{
if (cType == SFAction_ConditionType.KeyCode)
{
return typeof(KeyCodeChecker);
}
else return typeof(ActionConditionBase);
}

public void ResetCondition()
{
Debug.LogError("跳转");
if (cType == SFAction_ConditionType.KeyCode)
{
condition = new KeyCodeChecker();
}
}
}
}

上述代码看起来没有问题,但是隐藏了一个坑,我们可以发现,代码中 ActionConditionBase 是个基类,通常的思路中我们会用子类对这个积累进行赋值,但是这时候就出现问题了,ScriptableObject 无法正确的判断当前类究竟是哪个类,所以序列化会出问题。解决办法其实很简单,在基类和当前保存该基类的类上都要加上 [SerializeReference] 特性