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.
Vector3 origen =
objetivo.position +
Vector3.up * altura;
Vector3 direccion =
posicionDeseada - origen;
if (Physics.Raycast(
origen,
direccion.normalized,
out RaycastHit hit,
direccion.magnitude,
obstaculos))
{
posicionFinal =
hit.point -
direccion.normalized * margen;
}
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
);
}
[SerializeField]
private LayerMask obstaculos;
Así evitás detectar al propio jugador o elementos que no deberían bloquear la cámara.
Physics.Raycast(...)
Physics.SphereCast(...)
LayerMask
hit.distance