即使在 PlayMode 中,ScriptableObjects 也会在编辑器中进行序列化

访问 ScriptableObject 实例中的序列化字段时应格外小心。

如果字段标记为 public 或通过 SerializeField 序列化,则更改其值是永久性的。在退出像 MonoBehaviours 这样的播放模式时,它们不会重置。这有时很有用,但它也可能弄得一团糟。

因此,最好将序列化字段设置为只读,并完全避免使用公共字段。

public class MyScriptableObject : ScriptableObject
{
    [SerializeField]
    int mySerializedValue;

    public int MySerializedValue
    {
        get { return mySerializedValue; }
    }
}

如果你希望在 ScriptableObject 中存储在播放会话之间重置的公共值,请考虑使用以下模式。

public class MyScriptableObject : ScriptableObject
{
    // Private fields are not serialized and will reset to default on reset
    private int mySerializedValue;

    public int MySerializedValue
    {
        get { return mySerializedValue; }
        set { mySerializedValue = value; }
    }
}