public static bool CheckIfCharacterOnGround(GameEntity characterEntity, out Vector2 hitNormal, out float distanceToGround) { if (characterEntity.hasCollider && characterEntity.collider.Collider != null) { BoxCollider2D collider = characterEntity.collider.Collider; Bounds characterBounds = collider.bounds; Vector2 rayStart = new Vector2(characterBounds.min.x + characterBounds.size.x / 2, characterBounds.min.y); Debug.DrawRay(rayStart, Vector2.down * kGroundCheckDistance, Color.red, kDebugRayDuration); RaycastHit2D[] castResults = new RaycastHit2D[1]; ContactFilter2D contactFilter2D = new ContactFilter2D(); contactFilter2D.SetLayerMask(LayerMask.GetMask(Tags.Ground)); CharacterGroundState characterGroundState = characterEntity.characterGroundState.Value; if (characterGroundState == CharacterGroundState.OnGround || characterGroundState == CharacterGroundState.OnSlopeAhead || characterGroundState == CharacterGroundState.OnSlopeBehind) { if (collider.Cast(Vector2.down, contactFilter2D, castResults, characterEntity.stepSize.StepSize) > 0) { hitNormal = castResults[0].normal; distanceToGround = castResults[0].distance; return(true); } } else { if (collider.Cast(Vector2.down, contactFilter2D, castResults, kGroundCheckDistance) > 0) { hitNormal = castResults[0].normal; distanceToGround = castResults[0].distance; return(true); } } } hitNormal = Vector2.zero; distanceToGround = 0; return(false); }
private bool IsValidGroundState(CharacterGroundState stateToCheck) { return(stateToCheck == CharacterGroundState.OnGround || stateToCheck == CharacterGroundState.OnSlopeAhead || stateToCheck == CharacterGroundState.OnSlopeBehind); }