Created
October 9, 2020 17:33
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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