Skip to content

Instantly share code, notes, and snippets.

@James-Frowen
Created October 9, 2020 17:33
Show Gist options
  • Save James-Frowen/b7977b4233035350d7bed7bc24fda77e to your computer and use it in GitHub Desktop.
Save James-Frowen/b7977b4233035350d7bed7bc24fda77e to your computer and use it in GitHub Desktop.
TransformValues, syncs values of a transform even if it does not have a NetworkIdentity
namespace Mirror
{
public struct TransformValues
{
[Flags]
public enum SyncMode : byte
{
none = 0,
position = 1,
rotation = 2,
scale = 4,
netId = 8,
PosRot = position | rotation,
PosRotSca = PosRot | scale,
All = PosRotSca | netId
}
public readonly Transform transform;
public readonly SyncMode syncMode;
public TransformValues(Transform transform, SyncMode syncMode) : this()
{
this.transform = transform != null ? transform : throw new ArgumentNullException(nameof(transform));
this.syncMode = syncMode;
}
public Vector3 position;
public Quaternion rotation;
public Vector3 scale;
public NetworkIdentity identity;
}
public static class TransformValuesFunctions
{
public static void WriteTransformValues(this NetworkWriter writer, TransformValues value)
{
TransformValues.SyncMode mode = value.syncMode;
writer.WriteByte((byte)mode);
if ((mode & TransformValues.SyncMode.netId) > 0)
{
NetworkIdentity identity = value.transform.GetComponent<NetworkIdentity>();
writer.WriteNetworkIdentity(identity);
}
if ((mode & TransformValues.SyncMode.position) > 0) writer.WriteVector3(value.position);
if ((mode & TransformValues.SyncMode.rotation) > 0) writer.WriteQuaternion(value.rotation);
if ((mode & TransformValues.SyncMode.scale) > 0) writer.WriteVector3(value.scale);
}
public static TransformValues ReadTransformValues(this NetworkReader reader)
{
TransformValues.SyncMode mode = (TransformValues.SyncMode)reader.ReadByte();
NetworkIdentity identity = null;
Transform transform = null;
if ((mode & TransformValues.SyncMode.netId) > 0)
{
identity = reader.ReadNetworkIdentity();
if (identity != null)
{
transform = identity.transform;
}
}
TransformValues value = new TransformValues(transform, mode)
{
identity = identity,
position = (mode & TransformValues.SyncMode.position) > 0 ? reader.ReadVector3() : default,
rotation = (mode & TransformValues.SyncMode.rotation) > 0 ? reader.ReadQuaternion() : default,
scale = (mode & TransformValues.SyncMode.scale) > 0 ? reader.ReadVector3() : default,
};
return value;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment