Ejemplo simple de cámara orbital en tercera persona con Input System y detección básica de obstáculos.
using UnityEngine;
using UnityEngine.InputSystem;
public class ThirdPersonCamera : MonoBehaviour
{
[SerializeField]
private Transform objetivo;
[SerializeField]
private InputActionReference lookAction;
[SerializeField]
private float distancia = 5f;
[SerializeField]
private float altura = 1.8f;
[SerializeField]
private float sensibilidad = 1f;
[SerializeField]
private float suavizado = 12f;
[SerializeField]
private float pitchMinimo = -30f;
[SerializeField]
private float pitchMaximo = 70f;
[SerializeField]
private LayerMask obstaculos;
[SerializeField]
private float radioCamara = 0.2f;
[SerializeField]
private float margen = 0.1f;
private float yaw;
private float pitch;
void LateUpdate()
{
Vector2 look =
lookAction.action.ReadValue<Vector2>();
yaw += look.x * sensibilidad;
pitch -= look.y * sensibilidad;
pitch = Mathf.Clamp(
pitch,
pitchMinimo,
pitchMaximo
);
Quaternion rotacion =
Quaternion.Euler(
pitch,
yaw,
0f
);
Vector3 origen =
objetivo.position +
Vector3.up * altura;
Vector3 offset =
rotacion *
Vector3.back *
distancia;
Vector3 posicionDeseada =
origen + offset;
Vector3 direccion =
posicionDeseada - origen;
Vector3 posicionFinal =
posicionDeseada;
if (Physics.SphereCast(
origen,
radioCamara,
direccion.normalized,
out RaycastHit hit,
direccion.magnitude,
obstaculos))
{
posicionFinal =
origen +
direccion.normalized *
Mathf.Max(
hit.distance - margen,
0f
);
}
transform.position = Vector3.Lerp(
transform.position,
posicionFinal,
suavizado * Time.deltaTime
);
transform.LookAt(origen);
}
}