/// <summary> /// Create a State from a SmoothSync script. /// </summary> /// <remarks> /// This is called on owners when creating the States to be passed over the network. /// </remarks> /// <param name="smoothSyncScript"></param> public State(SmoothSync smoothSyncScript) { #if UNITY_WEBGL ownerTimestamp = (int)(Time.time * 1000.0f); #else ownerTimestamp = NetworkTransport.GetNetworkTimestamp(); #endif position = smoothSyncScript.getPosition(); rotation = smoothSyncScript.getRotation(); scale = smoothSyncScript.getScale(); if (smoothSyncScript.hasRigdibody) { velocity = smoothSyncScript.rb.velocity; angularVelocity = smoothSyncScript.rb.angularVelocity; } else if (smoothSyncScript.hasRigidbody2D) { velocity = smoothSyncScript.rb2D.velocity; angularVelocity = new Vector3(0, 0, smoothSyncScript.rb2D.angularVelocity); } else { velocity = Vector3.zero; angularVelocity = Vector3.zero; } }
public void copyFromSmoothSync(SmoothSync smoothSyncScript) { ownerTimestamp = Time.realtimeSinceStartup; position = smoothSyncScript.getPosition(); rotation = smoothSyncScript.getRotation(); scale = smoothSyncScript.getScale(); if (smoothSyncScript.hasRigidbody) { velocity = smoothSyncScript.rb.velocity; angularVelocity = smoothSyncScript.rb.angularVelocity * Mathf.Rad2Deg; } else if (smoothSyncScript.hasRigidbody2D) { velocity = smoothSyncScript.rb2D.velocity; angularVelocity.x = 0; angularVelocity.y = 0; angularVelocity.z = smoothSyncScript.rb2D.angularVelocity; } else { velocity = Vector3.zero; angularVelocity = Vector3.zero; } //atPositionalRest = smoothSyncScript.sendAtPositionalRestMessage; //atRotationalRest = smoothSyncScript.sendAtRotationalRestMessage; }
/// <summary> /// Deserialize a message from the network. /// </summary> /// <remarks> /// Only receives what it needs and decompresses floats if you chose to. /// </remarks> /// <param name="writer">The Networkreader to read from.</param> override public void Deserialize(NetworkReader reader) { // The first received byte tells us what we need to be syncing. byte syncInfoByte = reader.ReadByte(); bool syncPosition = shouldSyncPosition(syncInfoByte); bool syncRotation = shouldSyncRotation(syncInfoByte); bool syncScale = shouldSyncScale(syncInfoByte); bool syncVelocity = shouldSyncVelocity(syncInfoByte); bool syncAngularVelocity = shouldSyncAngularVelocity(syncInfoByte); NetworkInstanceId netID = reader.ReadNetworkId(); int syncIndex = (int)reader.ReadPackedUInt32(); state.ownerTimestamp = (int)reader.ReadPackedUInt32(); // Find the GameObject GameObject ob = null; if (NetworkServer.active) { ob = NetworkServer.FindLocalObject(netID); } else { ob = ClientScene.FindLocalObject(netID); } if (!ob) { Debug.LogWarning("Could not find target for network state message."); return; } // It doesn't matter which SmoothSync is returned since they all have the same list. smoothSync = ob.GetComponent <SmoothSync>(); // If we want the server to relay non-owned object information out to other clients, set these variables so we know what we need to send. if (NetworkServer.active && !smoothSync.hasAuthority) { state.serverShouldRelayPosition = syncPosition; state.serverShouldRelayRotation = syncRotation; state.serverShouldRelayScale = syncScale; state.serverShouldRelayVelocity = syncVelocity; state.serverShouldRelayAngularVelocity = syncAngularVelocity; } // Find the correct object to sync according to the syncIndex. for (int i = 0; i < smoothSync.childObjectSmoothSyncs.Length; i++) { if (smoothSync.childObjectSmoothSyncs[i].syncIndex == syncIndex) { smoothSync = smoothSync.childObjectSmoothSyncs[i]; } } if (!smoothSync) { Debug.LogWarning("Could not find target for network state message."); return; } // Read position. if (syncPosition) { if (smoothSync.isPositionCompressed) { if (smoothSync.isSyncingXPosition) { state.position.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYPosition) { state.position.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZPosition) { state.position.z = HalfHelper.Decompress(reader.ReadUInt16()); } } else { if (smoothSync.isSyncingXPosition) { state.position.x = reader.ReadSingle(); } if (smoothSync.isSyncingYPosition) { state.position.y = reader.ReadSingle(); } if (smoothSync.isSyncingZPosition) { state.position.z = reader.ReadSingle(); } } } else { if (smoothSync.stateCount > 0) { state.position = smoothSync.stateBuffer[0].position; } else { state.position = smoothSync.getPosition(); } } // Read rotation. if (syncRotation) { Vector3 rot = new Vector3(); if (smoothSync.isRotationCompressed) { if (smoothSync.isSyncingXRotation) { rot.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYRotation) { rot.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZRotation) { rot.z = HalfHelper.Decompress(reader.ReadUInt16()); } state.rotation = Quaternion.Euler(rot); } else { if (smoothSync.isSyncingXRotation) { rot.x = reader.ReadSingle(); } if (smoothSync.isSyncingYRotation) { rot.y = reader.ReadSingle(); } if (smoothSync.isSyncingZRotation) { rot.z = reader.ReadSingle(); } state.rotation = Quaternion.Euler(rot); } } else { if (smoothSync.stateCount > 0) { state.rotation = smoothSync.stateBuffer[0].rotation; } else { state.rotation = smoothSync.getRotation(); } } // Read scale. if (syncScale) { if (smoothSync.isScaleCompressed) { if (smoothSync.isSyncingXScale) { state.scale.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYScale) { state.scale.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZScale) { state.scale.z = HalfHelper.Decompress(reader.ReadUInt16()); } } else { if (smoothSync.isSyncingXScale) { state.scale.x = reader.ReadSingle(); } if (smoothSync.isSyncingYScale) { state.scale.y = reader.ReadSingle(); } if (smoothSync.isSyncingZScale) { state.scale.z = reader.ReadSingle(); } } } else { if (smoothSync.stateCount > 0) { state.scale = smoothSync.stateBuffer[0].scale; } else { state.scale = smoothSync.getScale(); } } // Read velocity. if (syncVelocity) { if (smoothSync.isVelocityCompressed) { if (smoothSync.isSyncingXVelocity) { state.velocity.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYVelocity) { state.velocity.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZVelocity) { state.velocity.z = HalfHelper.Decompress(reader.ReadUInt16()); } } else { if (smoothSync.isSyncingXVelocity) { state.velocity.x = reader.ReadSingle(); } if (smoothSync.isSyncingYVelocity) { state.velocity.y = reader.ReadSingle(); } if (smoothSync.isSyncingZVelocity) { state.velocity.z = reader.ReadSingle(); } } } else { state.velocity = Vector3.zero; } // Read anguluar velocity. if (syncAngularVelocity) { if (smoothSync.isAngularVelocityCompressed) { if (smoothSync.isSyncingXAngularVelocity) { state.angularVelocity.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYAngularVelocity) { state.angularVelocity.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZAngularVelocity) { state.angularVelocity.z = HalfHelper.Decompress(reader.ReadUInt16()); } } else { if (smoothSync.isSyncingXAngularVelocity) { state.angularVelocity.x = reader.ReadSingle(); } if (smoothSync.isSyncingYAngularVelocity) { state.angularVelocity.y = reader.ReadSingle(); } if (smoothSync.isSyncingZAngularVelocity) { state.angularVelocity.z = reader.ReadSingle(); } } } else { state.angularVelocity = Vector3.zero; } }
/// <summary> /// Deserialize a message from the network /// </summary> /// <remarks> /// Only receives what it needs. Optionally decompresses floats depending on the settings on the SmoothSync object. /// </remarks> /// <param name="writer">The Networkreader to read from </param> override public void Deserialize(NetworkReader reader) { byte syncInfoByte = reader.ReadByte(); bool syncPosition = shouldSyncPosition(syncInfoByte); bool syncRotation = shouldSyncRotation(syncInfoByte); bool syncVelocity = shouldSyncVelocity(syncInfoByte); bool syncAngularVelocity = shouldSyncAngularVelocity(syncInfoByte); NetworkInstanceId netID = reader.ReadNetworkId(); int syncIndex = (int)reader.ReadPackedUInt32(); state.ownerTimestamp = (int)reader.ReadPackedUInt32(); GameObject ob = null; if (NetworkServer.active) { ob = NetworkServer.FindLocalObject(netID); } else { ob = ClientScene.FindLocalObject(netID); } if (!ob) { Debug.LogWarning("Could not find target for network state message."); return; } // Doesn't matter which SmoothSync is returned since they all have the same list. smoothSync = ob.GetComponent <SmoothSync>(); // Find the correct object to sync according to syncIndex for (int i = 0; i < smoothSync.childObjectSmoothSyncs.Length; i++) { if (smoothSync.childObjectSmoothSyncs[i].syncIndex == syncIndex) { smoothSync = smoothSync.childObjectSmoothSyncs[i]; } } if (!smoothSync) { Debug.LogWarning("Could not find target for network state message."); return; } // read position if (syncPosition) { if (smoothSync.isPositionCompressed) { if (smoothSync.isSyncingXPosition) { state.position.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYPosition) { state.position.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZPosition) { state.position.z = HalfHelper.Decompress(reader.ReadUInt16()); } } else { if (smoothSync.isSyncingXPosition) { state.position.x = reader.ReadSingle(); } if (smoothSync.isSyncingYPosition) { state.position.y = reader.ReadSingle(); } if (smoothSync.isSyncingZPosition) { state.position.z = reader.ReadSingle(); } } } else { if (smoothSync.stateCount > 0) { state.position = smoothSync.stateBuffer[0].position; } else { state.position = smoothSync.getPosition(); } } // read velocity if (syncVelocity) { if (smoothSync.isVelocityCompressed) { if (smoothSync.isSyncingXVelocity) { state.velocity.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYVelocity) { state.velocity.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZVelocity) { state.velocity.z = HalfHelper.Decompress(reader.ReadUInt16()); } } else { if (smoothSync.isSyncingXVelocity) { state.velocity.x = reader.ReadSingle(); } if (smoothSync.isSyncingYVelocity) { state.velocity.y = reader.ReadSingle(); } if (smoothSync.isSyncingZVelocity) { state.velocity.z = reader.ReadSingle(); } } } else { state.velocity = Vector3.zero; } // read rotation if (syncRotation) { Vector3 rot = new Vector3(); if (smoothSync.isRotationCompressed) { if (smoothSync.isSyncingXRotation) { rot.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYRotation) { rot.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZRotation) { rot.z = HalfHelper.Decompress(reader.ReadUInt16()); } state.rotation = Quaternion.Euler(rot); } else { if (smoothSync.isSyncingXRotation) { rot.x = reader.ReadSingle(); } if (smoothSync.isSyncingYRotation) { rot.y = reader.ReadSingle(); } if (smoothSync.isSyncingZRotation) { rot.z = reader.ReadSingle(); } state.rotation = Quaternion.Euler(rot); } } else { if (smoothSync.stateCount > 0) { state.rotation = smoothSync.stateBuffer[0].rotation; } else { state.rotation = smoothSync.getRotation(); } } // read anguluar velocity if (syncAngularVelocity) { if (smoothSync.isAngularVelocityCompressed) { if (smoothSync.isSyncingXAngularVelocity) { state.angularVelocity.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYAngularVelocity) { state.angularVelocity.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZAngularVelocity) { state.angularVelocity.z = HalfHelper.Decompress(reader.ReadUInt16()); } } else { if (smoothSync.isSyncingXAngularVelocity) { state.angularVelocity.x = reader.ReadSingle(); } if (smoothSync.isSyncingYAngularVelocity) { state.angularVelocity.y = reader.ReadSingle(); } if (smoothSync.isSyncingZAngularVelocity) { state.angularVelocity.z = reader.ReadSingle(); } } } else { state.angularVelocity = Vector3.zero; } }