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);
    }
}

Qué incluye


Qué se puede agregar después