// This is called by MyPlayer upon interaction input public void Interact() { // Overlap test if (KinematicCharacterMotor.CharacterOverlap(KinematicCharacterMotor.TransientPosition, KinematicCharacterMotor.TransientRotation, _interactionOverlap, InteractionLayer, QueryTriggerInteraction.Collide) > 0) { if (_interactionOverlap[0] != null) { // Handle ladders MyLadder ladder = _interactionOverlap[0].gameObject.GetComponent <MyLadder>(); if (ladder) { // Transition to ladder climbing state if (CurrentMovementState == DefaultMovementState) { LadderClimbingState.ActiveLadder = ladder; TransitionToState(LadderClimbingState); } // Transition back to default movement state else if (CurrentMovementState == LadderClimbingState) { TransitionToState(DefaultMovementState); } } } } }
/// <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 ladder transitions _ladderUpDownInput = inputs.MoveAxisForward; if (inputs.ClimbLadder) { if (Motor.CharacterOverlap(Motor.TransientPosition, Motor.TransientRotation, _probedColliders, InteractionLayer, QueryTriggerInteraction.Collide) > 0) { if (_probedColliders[0] != null) { // Handle ladders MyLadder ladder = _probedColliders[0].gameObject.GetComponent <MyLadder>(); if (ladder) { // Transition to ladder climbing state if (CurrentCharacterState == CharacterState.Default) { _activeLadder = ladder; TransitionToState(CharacterState.Climbing); } // Transition back to default movement state else if (CurrentCharacterState == CharacterState.Climbing) { _climbingState = ClimbingState.DeAnchoring; _ladderTargetPosition = Motor.TransientPosition; _ladderTargetRotation = _rotationBeforeClimbing; } } } } } // 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; } } }