diff --git a/Runtime/Util/SyncTransform.cs b/Runtime/Util/SyncTransform.cs index dddd19f..54b23ea 100644 --- a/Runtime/Util/SyncTransform.cs +++ b/Runtime/Util/SyncTransform.cs @@ -9,12 +9,18 @@ namespace VelNet [AddComponentMenu("VelNet/VelNet Sync Transform")] public class SyncTransform : NetworkSerializedObjectStream { - public bool useLocalTransform; - [Tooltip("0 to disable.")] - public float teleportDistance; - [Tooltip("0 to disable.")] - public float teleportAngle; + [Space] + public bool position = true; + public bool rotation = true; + [Tooltip("Scale is always local")] public bool scale; + [Space] + public bool useLocalTransform; + + [Tooltip("0 to disable.")] public float teleportDistance; + [Tooltip("0 to disable.")] public float teleportAngle; + + private Vector3 targetScale; private Vector3 targetPosition; private Quaternion targetRotation; private float distanceAtReceiveTime; @@ -32,6 +38,8 @@ namespace VelNet targetPosition = transform.position; targetRotation = transform.rotation; } + + targetScale = transform.localScale; } /// @@ -39,8 +47,9 @@ namespace VelNet /// protected override void SendState(BinaryWriter writer) { - writer.Write(transform.localPosition); - writer.Write(transform.localRotation); + if (position) writer.Write(transform.localPosition); + if (rotation) writer.Write(transform.localRotation); + if (scale) writer.Write(transform.localScale); } /// @@ -49,8 +58,9 @@ namespace VelNet /// protected override void ReceiveState(BinaryReader reader) { - targetPosition = reader.ReadVector3(); - targetRotation = reader.ReadQuaternion(); + if (position) targetPosition = reader.ReadVector3(); + if (rotation) targetRotation = reader.ReadQuaternion(); + if (scale) targetScale = reader.ReadVector3(); // record the distance from the target for interpolation if (useLocalTransform) @@ -61,6 +71,7 @@ namespace VelNet { transform.localPosition = targetPosition; } + if (teleportAngle != 0 && teleportAngle < angleAtReceiveTime) { transform.localRotation = targetRotation; @@ -74,6 +85,7 @@ namespace VelNet { transform.position = targetPosition; } + if (teleportAngle != 0 && teleportAngle < angleAtReceiveTime) { transform.rotation = targetRotation; @@ -87,28 +99,52 @@ namespace VelNet if (useLocalTransform) { - transform.localPosition = Vector3.MoveTowards( - transform.localPosition, - targetPosition, - Time.deltaTime * distanceAtReceiveTime * serializationRateHz - ); - transform.localRotation = Quaternion.RotateTowards( - transform.localRotation, - targetRotation, - Time.deltaTime * angleAtReceiveTime * serializationRateHz - ); + if (position) + { + transform.localPosition = Vector3.MoveTowards( + transform.localPosition, + targetPosition, + Time.deltaTime * distanceAtReceiveTime * serializationRateHz + ); + } + + if (rotation) + { + transform.localRotation = Quaternion.RotateTowards( + transform.localRotation, + targetRotation, + Time.deltaTime * angleAtReceiveTime * serializationRateHz + ); + } } else { - transform.position = Vector3.MoveTowards( - transform.position, - targetPosition, - Time.deltaTime * distanceAtReceiveTime * serializationRateHz - ); - transform.rotation = Quaternion.RotateTowards( - transform.rotation, - targetRotation, - Time.deltaTime * angleAtReceiveTime * serializationRateHz + if (position) + { + transform.position = Vector3.MoveTowards( + transform.position, + targetPosition, + Time.deltaTime * distanceAtReceiveTime * serializationRateHz + ); + } + + if (rotation) + { + transform.rotation = Quaternion.RotateTowards( + transform.rotation, + targetRotation, + Time.deltaTime * angleAtReceiveTime * serializationRateHz + ); + } + } + + + if (scale) + { + transform.localScale = Vector3.Lerp( + transform.localScale, + targetScale, + Time.deltaTime * serializationRateHz ); } } diff --git a/Runtime/VelNetManager.cs b/Runtime/VelNetManager.cs index b8d8761..bf12ae2 100644 --- a/Runtime/VelNetManager.cs +++ b/Runtime/VelNetManager.cs @@ -1053,8 +1053,8 @@ namespace VelNet { VelNetLogger.Error("Room name is null. Can't get info for this room."); return; - } - + } + MemoryStream stream = new MemoryStream(); BinaryWriter writer = new BinaryWriter(stream); @@ -1206,7 +1206,7 @@ namespace VelNet NetworkObject prefab = instance.prefabs.Find(p => p.name == prefabName); if (prefab == null) { - VelNetLogger.Error("Couldn't find a prefab with that name: " + prefabName); + VelNetLogger.Error("Couldn't find a prefab with that name: " + prefabName + "\nMake sure to add the prefab to list of prefabs in VelNetManager"); return null; }