Files
survival-game/Assets/Mirror/Components/PredictedRigidbody/PredictedSyncData.cs
2025-06-16 15:14:23 +02:00

55 lines
2.1 KiB
C#

// this struct exists only for OnDe/Serialize performance.
// instead of WriteVector3+Quaternion+Vector3+Vector3,
// we read & write the whole struct as blittable once.
//
// struct packing can cause odd results with blittable on different platforms,
// so this is usually not recommended!
//
// in this case however, we need to squeeze everything we can out of prediction
// to support low even devices / VR.
using System.Runtime.InteropServices;
using UnityEngine;
namespace Mirror
{
// struct packing
[StructLayout(LayoutKind.Sequential)] // explicitly force sequential
public struct PredictedSyncData
{
public float deltaTime; // 4 bytes (word aligned)
public Vector3 position; // 12 bytes (word aligned)
public Quaternion rotation; // 16 bytes (word aligned)
public Vector3 velocity; // 12 bytes (word aligned)
public Vector3 angularVelocity; // 12 bytes (word aligned)
// DO NOT SYNC SLEEPING! this cuts benchmark performance in half(!!!)
// public byte sleeping; // 1 byte: bool isn't blittable
// constructor for convenience
public PredictedSyncData(float deltaTime, Vector3 position, Quaternion rotation, Vector3 velocity, Vector3 angularVelocity)//, bool sleeping)
{
this.deltaTime = deltaTime;
this.position = position;
this.rotation = rotation;
this.velocity = velocity;
this.angularVelocity = angularVelocity;
// DO NOT SYNC SLEEPING! this cuts benchmark performance in half(!!!)
// this.sleeping = sleeping ? (byte)1 : (byte)0;
}
}
// NetworkReader/Writer extensions to write this struct
public static class PredictedSyncDataReadWrite
{
public static void WritePredictedSyncData(this NetworkWriter writer, PredictedSyncData data)
{
writer.WriteBlittable(data);
}
public static PredictedSyncData ReadPredictedSyncData(this NetworkReader reader)
{
return reader.ReadBlittable<PredictedSyncData>();
}
}
}