Un Ground Check detecta si el personaje está tocando el suelo.

CharacterController

La opción básica:

controller.isGrounded

Raycast

bool enSuelo = Physics.Raycast(
    transform.position,
    Vector3.down,
    distanciaSuelo,
    layerSuelo
);

SphereCast

Suele ser más estable que un rayo muy fino.

bool enSuelo = Physics.SphereCast(
    transform.position,
    radio,
    Vector3.down,
    out RaycastHit hit,
    distancia,
    layerSuelo
);

CheckSphere

Muy práctico para personajes.

[SerializeField]
private Transform groundCheck;

[SerializeField]
private float radioSuelo = 0.3f;

[SerializeField]
private LayerMask suelo;

bool enSuelo = Physics.CheckSphere(
    groundCheck.position,
    radioSuelo,
    suelo
);

Gizmo

Podés visualizar el área:

void OnDrawGizmosSelected()
{
    if (groundCheck == null)
    {
        return;
    }

    Gizmos.DrawWireSphere(
        groundCheck.position,
        radioSuelo
    );
}