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。
看起来有点像悖论……可以这样做吗?
我无法序列化 Transform 组件,因此我需要在序列化时忽略它,但我仍然需要此 _transform 字段在检查器中可见。
你不能这样做,但有一个解决方法。就像斯科特提到的那样,使用JsonUtilty. 这不会完全解决您的问题,但会防止您在尝试因变量而对 json 数据进行反序列化时出现错误 _transform。
您只需要Transform类中的位置、旋转和缩放,所有这些都可以序列化,因为它们要么是Vector3要么Quaternion但Transform不能序列化。因此,您必须声明位置、旋转和缩放,并从_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,序列化数据时不会出现任何问题。如果您打算保存它,那么请查看我制作的一个简单的包装器来处理所有这些。
| 归档时间: |
|
| 查看次数: |
10348 次 |
| 最近记录: |