Example #1
0
    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);
    }
Example #2
0
 private bool IsValidGroundState(CharacterGroundState stateToCheck)
 {
     return(stateToCheck == CharacterGroundState.OnGround ||
            stateToCheck == CharacterGroundState.OnSlopeAhead ||
            stateToCheck == CharacterGroundState.OnSlopeBehind);
 }