diff --git a/testproject/Assets/Tests/Manual/Scripts/PlayerMovementManager.cs b/testproject/Assets/Tests/Manual/Scripts/PlayerMovementManager.cs index e762c07978..d03cc624eb 100644 --- a/testproject/Assets/Tests/Manual/Scripts/PlayerMovementManager.cs +++ b/testproject/Assets/Tests/Manual/Scripts/PlayerMovementManager.cs @@ -31,7 +31,7 @@ public override void OnNetworkSpawn() m_Rigidbody = GetComponent(); if (m_Rigidbody != null) { - m_Rigidbody.isKinematic = !NetworkObject.IsOwner; + m_Rigidbody.isKinematic = !NetworkObject.NetworkManager.IsServer; } } @@ -44,18 +44,10 @@ private void Update() m_RandomMovement.enabled = !m_RandomMovement.enabled; } } - } - private void FixedUpdate() - { if (m_NetworkedObject && m_NetworkedObject.NetworkManager && m_NetworkedObject.NetworkManager.IsListening) { - - if (!m_NetworkedObject.IsOwner) - { - return; - } - else if (m_RandomMovement.enabled) + if (m_RandomMovement.enabled) { m_RandomMovement.Move(MoveSpeed); } diff --git a/testproject/Assets/Tests/Manual/Scripts/RandomMovement.cs b/testproject/Assets/Tests/Manual/Scripts/RandomMovement.cs index 9c9a10adee..5d1e1f1422 100644 --- a/testproject/Assets/Tests/Manual/Scripts/RandomMovement.cs +++ b/testproject/Assets/Tests/Manual/Scripts/RandomMovement.cs @@ -17,29 +17,87 @@ public override void OnNetworkSpawn() m_Rigidbody = GetComponent(); if (NetworkObject != null && m_Rigidbody != null) { - m_Rigidbody.isKinematic = !NetworkObject.IsOwner; - if (!m_Rigidbody.isKinematic) + if (NetworkObject.IsOwner) { ChangeDirection(true, true); } } } + /// + /// Notify the server of any client side change in direction or speed + /// + /// + [ServerRpc(RequireOwnership = false)] + private void MovePlayerServerRpc(Vector3 moveTowards) + { + m_MoveTowardsPosition = moveTowards; + } + + private Vector3 m_MoveTowardsPosition; + public void Move(int speed) { - m_Rigidbody.MovePosition(transform.position + m_Direction * (speed * Time.fixedDeltaTime)); + // Server sets this locally + if (IsServer && IsOwner) + { + m_MoveTowardsPosition = (m_Direction * speed); + } + else if (!IsServer && IsOwner) + { + // Client must sent Rpc + MovePlayerServerRpc(m_Direction * speed); + } + } + + // We just apply our current direction with magnitude to our current position during fixed update + private void FixedUpdate() + { + if (IsServer && NetworkObject && NetworkObject.NetworkManager && NetworkObject.NetworkManager.IsListening) + { + if (m_Rigidbody == null) + { + m_Rigidbody = GetComponent(); + } + if (m_Rigidbody != null) + { + m_Rigidbody.MovePosition(transform.position + (m_MoveTowardsPosition * Time.fixedDeltaTime)); + } + } + } + + /// + /// Handles server notification to client that we need to change direction + /// + /// + [ClientRpc] + private void ChangeDirectionClientRpc(Vector3 direction) + { + m_Direction = direction; } private void OnCollisionStay(Collision collision) { - if (collision.gameObject.CompareTag("Floor") || collision.gameObject.CompareTag("GenericObject")) + if (IsServer) { - return; + if (collision.gameObject.CompareTag("Floor") || collision.gameObject.CompareTag("GenericObject")) + { + return; + } + Vector3 collisionPoint = collision.collider.ClosestPoint(transform.position); + bool moveRight = collisionPoint.x < transform.position.x; + bool moveDown = collisionPoint.z > transform.position.z; + + ChangeDirection(moveRight, moveDown); + + // If we are not the owner then we need to notify the client that their direction + // must change + if (!IsOwner) + { + m_MoveTowardsPosition = m_Direction * m_MoveTowardsPosition.magnitude; + ChangeDirectionClientRpc(m_Direction); + } } - Vector3 collisionPoint = collision.collider.ClosestPoint(transform.position); - bool moveRight = collisionPoint.x < transform.position.x; - bool moveDown = collisionPoint.z > transform.position.z; - ChangeDirection(moveRight, moveDown); } private void ChangeDirection(bool moveRight, bool moveDown)