private void HandleCharacterInput() { PlayerCharacterInputs characterInputs = new PlayerCharacterInputs(); // Build the CharacterInputs struct characterInputs.MoveAxisForward = Input.GetAxisRaw(VerticalInput); characterInputs.MoveAxisRight = Input.GetAxisRaw(HorizontalInput); characterInputs.CameraRotation = OrbitCamera.Transform.rotation; characterInputs.JumpDown = Input.GetKeyDown(KeyCode.Space); characterInputs.JumpHeld = Input.GetKey(KeyCode.Space); characterInputs.CrouchDown = Input.GetKeyDown(KeyCode.C); characterInputs.CrouchUp = Input.GetKeyUp(KeyCode.C); characterInputs.CrouchHeld = Input.GetKey(KeyCode.C); characterInputs.NoClipDown = Input.GetKeyUp(KeyCode.Q); // Apply inputs to character Character.SetInputs(ref characterInputs); }
/// <summary> /// This is called every frame by MyPlayer in order to tell the character what its inputs are /// </summary> public void SetInputs(ref PlayerCharacterInputs inputs) { // Handle state transition from input if (inputs.NoClipDown) { if (CurrentCharacterState == CharacterState.Default) { TransitionToState(CharacterState.NoClip); } else if (CurrentCharacterState == CharacterState.NoClip) { TransitionToState(CharacterState.Default); } } _jumpInputIsHeld = inputs.JumpHeld; _crouchInputIsHeld = inputs.CrouchHeld; // Clamp input Vector3 moveInputVector = Vector3.ClampMagnitude(new Vector3(inputs.MoveAxisRight, 0f, inputs.MoveAxisForward), 1f); // Calculate camera direction and rotation on the character plane Vector3 cameraPlanarDirection = Vector3.ProjectOnPlane(inputs.CameraRotation * Vector3.forward, Motor.CharacterUp).normalized; if (cameraPlanarDirection.sqrMagnitude == 0f) { cameraPlanarDirection = Vector3.ProjectOnPlane(inputs.CameraRotation * Vector3.up, Motor.CharacterUp).normalized; } Quaternion cameraPlanarRotation = Quaternion.LookRotation(cameraPlanarDirection, Motor.CharacterUp); switch (CurrentCharacterState) { case CharacterState.Default: { // Move and look inputs _moveInputVector = cameraPlanarRotation * moveInputVector; _lookInputVector = cameraPlanarDirection; // Jumping input if (inputs.JumpDown) { _timeSinceJumpRequested = 0f; _jumpRequested = true; } // Crouching input if (inputs.CrouchDown) { _shouldBeCrouching = true; if (!_isCrouching) { _isCrouching = true; Motor.SetCapsuleDimensions(0.5f, 1f, 0.5f); MeshRoot.localScale = new Vector3(1f, 0.5f, 1f); } } else if (inputs.CrouchUp) { _shouldBeCrouching = false; } break; } case CharacterState.NoClip: { _moveInputVector = inputs.CameraRotation * moveInputVector; _lookInputVector = cameraPlanarDirection; break; } } }