不序列化字段但显示在检查器中

Pow*_*rek 5 c# serialization unity-game-engine

假设我有一堂这样的课:

[System.Serializable]
public class Item {
private Transform _transform;
private float _value;
}
Run Code Online (Sandbox Code Playgroud)

我想使用 BinaryFormatter 序列化此类。我无法序列化Transform组件,因此我需要在序列化时忽略它,但我仍然需要此_transform字段在检查器中可见。在此示例中,仅应序列化字段_value 。

如果我在_transform字段上使用[System.NonSerialized],它将在 Unity 检查器中不可见,如果我使用[SerializeField],我无法使用 BinaryFormatter 序列化 Transform。

看起来有点像悖论……可以这样做吗?

Pro*_*mer 2

我无法序列化 Transform 组件,因此我需要在序列化时忽略它,但我仍然需要此 _transform 字段在检查器中可见。

你不能这样做,但有一个解决方法。就像斯科特提到的那样,使用JsonUtilty. 这不会完全解决您的问题,但会防止您在尝试因变量而对 json 数据进行反序列化时出现错误 _transform

您只需要Transform类中的位置、旋转和缩放,所有这些都可以序列化,因为它们要么是Vector3要么QuaternionTransform不能序列化。因此,您必须声明位置、旋转和缩放,并从_transform变量中获取它们的值。然后您可以序列化这 3 个值。

[System.Serializable]
public class Item
{
    //Will be ignored by JsonUtility but will be visible in the Editor
    [SerializeField]
    private Transform _transform;
    [SerializeField]
    private float _value;

    [SerializeField]
    private Vector3 position;
    [SerializeField]
    private Quaternion rotation;
    [SerializeField]
    private Vector3 scale;

    //Call before serializing
    public void updateValues()
    {
        position = _transform.position;
        rotation = _transform.rotation;
        scale = _transform.localScale;
    }
}
Run Code Online (Sandbox Code Playgroud)

updateValues()在将对象序列化为 json 之前调用该函数。

void Start()
{
    Item item = new Item();
    ...
    ...
    item.updateValues();
    string json = JsonUtility.ToJson(item);
    Debug.Log(json);
}
Run Code Online (Sandbox Code Playgroud)

通过使用 json,序列化数据时不会出现任何问题。如果您打算保存它,那么请查看我制作的一个简单的包装器来处理所有这些。