目录
在unity中直接序列化Vector3、Quaternion会报错
这是其中一种解决方案,用新类或结构体重新封装三维向量和四元数,并标记[Serializable]即可被序列化。
将物体数据保存成自己新建的类型,赋值的时候调用工具里的静态方法,可直接将Vector3转成SerVector3类型,要取数据的时候,直接使用属性 SerVector3.Vector_3 即可获得Vector3向量,四元数同理。
封装好的结构体
using System;
using UnityEngine;
/// <summary>
///
/// * Writer:June
///
/// * Data:2022.1.6
///
/// * Function:可序列化的三维向量
///
/// * Remarks:
///
/// </summary>
[Serializable]
public struct SerVector3
{
public float x;
public float y;
public float z;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="_x">X</param>
/// <param name="_y">Y</param>
/// <param name="_z">Z</param>
public SerVector3(float _x, float _y, float _z)
{
x = _x;
y = _y;
z = _z;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="v3">Vector3向量</param>
public SerVector3(Vector3 v3)
{
x = v3.x;
y = v3.y;
z = v3.z;
}
/// <summary>
/// 获取初始化的向量 SerVector3(0, 0, 0)
/// </summary>
public static SerVector3 Zero { get => new SerVector3(0, 0, 0); }
/// <summary>
/// 设置函数
/// </summary>
/// <param name="_x">x</param>
/// <param name="_y">y</param>
/// <param name="_z">z</param>
public void Set(float _x, float _y, float _z)
{
x = _x;
y = _y;
z = _z;
}
/// <summary>
/// 设置函数
/// </summary>
/// <param name="v3">Vector3</param>
public void Set(Vector3 v3)
{
x = v3.x;
y = v3.y;
z = v3.z;
}
/// <summary>
/// Vector3属性
/// </summary>
public Vector3 Vector_3
{
get
{
Vector3 tmpV3 = Vector3.zero;
tmpV3.Set(x, y, z);
return tmpV3;
}
set
{
x = value.x;
y = value.y;
z = value.z;
}
}
}
/// <summary>
///
/// * Function:可序列化的四元数
///
/// * Remarks:
///
/// </summary>
[Serializable]
public struct SerQuaternion
{
public float x;
public float y;
public float z;
public float w;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="_x">X</param>
/// <param name="_y">Y</param>
/// <param name="_z">Z</param>
/// <param name="_w">W</param>
public SerQuaternion(float _x, float _y, float _z, float _w)
{
x = _x;
y = _y;
z = _z;
w = _w;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="quaternion">四元数</param>
public SerQuaternion(Quaternion quaternion)
{
x = quaternion.x;
y = quaternion.y;
z = quaternion.z;
w = quaternion.w;
}
/// <summary>
/// 获取初始化的四元数 SerQuaternion(0, 0, 0, 0)
/// </summary>
public static SerQuaternion Zero { get => new SerQuaternion(0, 0, 0, 0); }
/// <summary>
/// 设置函数
/// </summary>
/// <param name="_x">x</param>
/// <param name="_y">y</param>
/// <param name="_z">z</param>
/// <param name="_w">w</param>
public void Set(float _x, float _y, float _z, float _w)
{
x = _x;
y = _y;
z = _z;
w = _w;
}
/// <summary>
/// 设置函数
/// </summary>
/// <param name="qua">Quaternion</param>
public void Set(Quaternion qua)
{
x = qua.x;
y = qua.y;
z = qua.z;
w = qua.w;
}
/// <summary>
/// Quaternion属性
/// </summary>
public Quaternion Quaternion_4
{
get
{
Quaternion tmpQua = Quaternion.identity;
tmpQua.Set(x, y, z, w);
return tmpQua;
}
set
{
x = value.x;
y = value.y;
z = value.z;
w = value.w;
}
}
}
转换工具
/// <summary>
/// vector3向量转成封装好的、可序列化的向量类
/// </summary>
/// <param name="targetV3">目标向量</param>
/// <returns>可序列化的Vector3向量</returns>
public static SerVector3 Vector3ToSerV3(Vector3 targetV3)
{
SerVector3 serV3 = SerVector3.Zero;
serV3.Set(targetV3);
return serV3;
}
/// <summary>
/// Quaternion转成封装好的、可序列化的向量类
/// </summary>
/// <param name="targetQua">目标四元数</param>
/// <returns>可序列化的四元数</returns>
public static SerQuaternion QuaternionToSerQua(Quaternion targetQua)
{
SerQuaternion serquat = SerQuaternion.Zero;
serquat.Set(targetQua);
return serquat;
}