Unity | 用于可序列化的Vector3、Quaternion

目录

封装好的结构体

转换工具


在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;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值