En tercera persona, la cámara puede atravesar paredes si solo mantiene una distancia fija.

La solución habitual es detectar obstáculos entre el jugador y la cámara.

Dirección

Vector3 origen =
    objetivo.position +
    Vector3.up * altura;

Vector3 direccion =
    posicionDeseada - origen;

Raycast

if (Physics.Raycast(
    origen,
    direccion.normalized,
    out RaycastHit hit,
    direccion.magnitude,
    obstaculos))
{
    posicionFinal =
        hit.point -
        direccion.normalized * margen;
}

SphereCast

Suele ser mejor que un Raycast porque la cámara tiene un volumen práctico.

if (Physics.SphereCast(
    origen,
    radioCamara,
    direccion.normalized,
    out RaycastHit hit,
    direccion.magnitude,
    obstaculos))
{
    posicionFinal =
        origen +
        direccion.normalized *
        Mathf.Max(
            hit.distance - margen,
            0f
        );
}

LayerMask

[SerializeField]
private LayerMask obstaculos;

Así evitás detectar al propio jugador o elementos que no deberían bloquear la cámara.


Resumen rápido

Physics.Raycast(...)
Physics.SphereCast(...)
LayerMask
hit.distance