private bool IsGrounded() { float offsetCenter = 0.3f; float offsetHeight = 0.5f; float distance = 0.6f; Vector3 tempV = Vector3.zero; Vector3 v = new Vector3(transform.position.x, m_collider.bounds.min.y + offsetHeight, transform.position.z); for (int i = 0; i < 4; i++) { // Define ray switch (i) { case (0): tempV = new Vector3(transform.forward.x * offsetCenter, 0, transform.forward.z * offsetCenter); break; case (1): tempV = -tempV; break; case (2): tempV = new Vector3(transform.right.x * offsetCenter, 0, transform.right.z * offsetCenter); break; case (3): tempV = -tempV; break; default: break; } // Shoot ray if (Physics.Raycast(tempV + v, Vector3.down, out m_rayHit, distance, m_StandableLayers)) { if (!CurrentMovementState.Equals(MovementState.Sliding)) { m_rigidbody.MovePosition(new Vector3(m_rigidbody.position.x, m_rayHit.point.y + m_collider.bounds.size.y / 2, m_rigidbody.position.z)); } return(true); } } return(false); }
// Finds out what state the player is currently in private void DetermineState() { if (!CurrentMovementState.Equals(MovementState.Climbing)) { if (IsGrounded()) { if (!IsSliding()) { if (m_inputManager.MovingCharacter()) { CurrentMovementState = MovementState.Moving; } else { CurrentMovementState = MovementState.Idle; } } else { CurrentMovementState = MovementState.Sliding; } m_controllerClimbing.State = ControllerClimbing.ClimbingState.NotClimbing; m_isGrounded = true; UsingGravity = false; } else { m_isGrounded = false; UsingGravity = true; if (m_rigidbody.velocity.y > 0) { CurrentMovementState = MovementState.Jumping; } else { CurrentMovementState = MovementState.Falling; } } } }