141 lines
4.0 KiB
C#
141 lines
4.0 KiB
C#
using FishNet.Component.Prediction;
|
|
using FishNet.Serializing;
|
|
using UnityEngine;
|
|
|
|
namespace FishNet.Component.Prediction
|
|
{
|
|
public struct RigidbodyState
|
|
{
|
|
public uint LocalTick;
|
|
public Vector3 Position;
|
|
public Quaternion Rotation;
|
|
public bool IsKinematic;
|
|
public Vector3 Velocity;
|
|
public Vector3 AngularVelocity;
|
|
|
|
public RigidbodyState(Rigidbody rb, bool isKinematic, uint tick) : this(rb, tick)
|
|
{
|
|
Position = rb.transform.position;
|
|
Rotation = rb.transform.rotation;
|
|
IsKinematic = isKinematic;
|
|
Velocity = rb.velocity;
|
|
AngularVelocity = rb.angularVelocity;
|
|
LocalTick = tick;
|
|
|
|
}
|
|
|
|
public RigidbodyState(Rigidbody rb, uint tick)
|
|
{
|
|
Position = rb.transform.position;
|
|
Rotation = rb.transform.rotation;
|
|
IsKinematic = rb.isKinematic;
|
|
Velocity = rb.velocity;
|
|
AngularVelocity = rb.angularVelocity;
|
|
LocalTick = tick;
|
|
}
|
|
}
|
|
|
|
public struct Rigidbody2DState
|
|
{
|
|
public uint LocalTick;
|
|
public Vector3 Position;
|
|
public Quaternion Rotation;
|
|
public bool Simulated;
|
|
public Vector2 Velocity;
|
|
public float AngularVelocity;
|
|
|
|
public Rigidbody2DState(Rigidbody2D rb, bool simulated, uint tick)
|
|
{
|
|
Simulated = simulated;
|
|
Position = rb.transform.position;
|
|
Rotation = rb.transform.rotation;
|
|
Velocity = rb.velocity;
|
|
AngularVelocity = rb.angularVelocity;
|
|
LocalTick = tick;
|
|
}
|
|
|
|
public Rigidbody2DState(Rigidbody2D rb, uint tick)
|
|
{
|
|
Simulated = rb.simulated;
|
|
Position = rb.transform.position;
|
|
Rotation = rb.transform.rotation;
|
|
Velocity = rb.velocity;
|
|
AngularVelocity = rb.angularVelocity;
|
|
LocalTick = tick;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static class RigidbodyStateSerializers
|
|
{
|
|
|
|
public static void WriteRigidbodyState(this Writer writer, RigidbodyState value)
|
|
{
|
|
writer.WriteUInt32(value.LocalTick, AutoPackType.Unpacked);
|
|
writer.WriteVector3(value.Position);
|
|
writer.WriteQuaternion(value.Rotation);
|
|
writer.WriteBoolean(value.IsKinematic);
|
|
if (!value.IsKinematic)
|
|
{
|
|
writer.WriteVector3(value.Velocity);
|
|
writer.WriteVector3(value.AngularVelocity);
|
|
}
|
|
}
|
|
|
|
public static RigidbodyState ReadRigidbodyState(this Reader reader)
|
|
{
|
|
RigidbodyState state = new RigidbodyState()
|
|
{
|
|
LocalTick = reader.ReadUInt32(AutoPackType.Unpacked),
|
|
Position = reader.ReadVector3(),
|
|
Rotation = reader.ReadQuaternion(),
|
|
IsKinematic = reader.ReadBoolean()
|
|
};
|
|
|
|
if (!state.IsKinematic)
|
|
{
|
|
state.Velocity = reader.ReadVector3();
|
|
state.AngularVelocity = reader.ReadVector3();
|
|
}
|
|
|
|
return state;
|
|
}
|
|
|
|
|
|
public static void WriteRigidbody2DState(this Writer writer, Rigidbody2DState value)
|
|
{
|
|
writer.WriteUInt32(value.LocalTick, AutoPackType.Unpacked);
|
|
writer.WriteVector3(value.Position);
|
|
writer.WriteQuaternion(value.Rotation);
|
|
writer.WriteBoolean(value.Simulated);
|
|
|
|
if (value.Simulated)
|
|
{
|
|
writer.WriteVector2(value.Velocity);
|
|
writer.WriteSingle(value.AngularVelocity);
|
|
}
|
|
}
|
|
|
|
public static Rigidbody2DState ReadRigidbody2DState(this Reader reader)
|
|
{
|
|
Rigidbody2DState state = new Rigidbody2DState()
|
|
{
|
|
LocalTick = reader.ReadUInt32(AutoPackType.Unpacked),
|
|
Position = reader.ReadVector3(),
|
|
Rotation = reader.ReadQuaternion(),
|
|
Simulated = reader.ReadBoolean(),
|
|
};
|
|
|
|
if (state.Simulated)
|
|
{
|
|
state.Velocity = reader.ReadVector2();
|
|
state.AngularVelocity = reader.ReadSingle();
|
|
}
|
|
|
|
return state;
|
|
}
|
|
|
|
|
|
}
|
|
|