/// <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); } }
/// <summary> /// Generate Input Command from Controller /// </summary> private void GenerateInputCommand() { // read inputs float h = m_Horizontal; float v = m_Vertical; bool crouch = m_Crouch; // calculate move direction to pass to character if (m_Cam != null) { // calculate camera relative direction to move: m_CamForward = Vector3.Scale(m_Cam.forward, new Vector3(1, 0, 1)).normalized; m_Move = v * m_CamForward + h * m_Cam.right; } else { // we use world-relative directions in the case of no main camera m_Move = v * Vector3.forward + h * Vector3.right; } #if !MOBILE_INPUT // walk speed multiplier if (m_Walk) { m_Move *= 0.5f; } #endif ICharacterCmdInput input = CharacterCmd.Create(); input.Move = m_Move; input.Jump = m_Jump; input.Crouch = crouch; entity.QueueInput(input); m_Jump = false; }