/// <summary> /// Execute Command /// Called on Owner for authorize and Controller for predictable /// </summary> /// <param name="command"></param> /// <param name="resetState"></param> public override void ExecuteCommand(Command command, bool resetState) { CharacterCmd cmd = command as CharacterCmd; if (resetState) { m_Character.SetState(cmd.Result.Position, cmd.Result.Rotation, cmd.Result.Velocity, cmd.Result.IsGround, cmd.Result.JumpFrame); AnimatePlayer(cmd, m_Character.CurrentState); } else { TutorialCharacterController.State outputState = m_Character.Move(cmd.Input.Move, cmd.Input.Jump); //Update cmd Result cmd.Result.Position = outputState.position; cmd.Result.Velocity = outputState.velocity; cmd.Result.Rotation = outputState.rotation; cmd.Result.IsGround = outputState.isGrounded; cmd.Result.JumpFrame = outputState.jumpFrames; if (cmd.IsFirstExecution) { AnimatePlayer(cmd, outputState); } } }
//Animating player private void AnimatePlayer(CharacterCmd cmd, TutorialCharacterController.State outputState) { // FWD <> BWD movement Vector3 relativeMove = transform.InverseTransformDirection(cmd.Input.Move); m_Animator.SetFloat("Forward", relativeMove.z, 0.1f, Time.deltaTime); float m_TurnAmount = Mathf.Atan2(relativeMove.x, relativeMove.z); m_Animator.SetFloat("Turn", m_TurnAmount, 0.1f, Time.deltaTime); if (outputState.isGrounded) { m_Animator.SetBool("OnGround", true); m_Animator.SetFloat("Jump", 0); } else { m_Animator.SetBool("OnGround", false); m_Animator.SetFloat("Jump", outputState._jumpProgress); } }