Cámara con tirones

Si el jugador se mueve en Update y la cámara también, pueden aparecer pequeñas inconsistencias.

Probar seguimiento en:

LateUpdate()

Cámara atraviesa paredes

Agregar detección con:

Raycast
SphereCast

Rotación vertical ilimitada

Usar:

Mathf.Clamp(pitch, minimo, maximo);

Movimiento demasiado brusco

Usar suavizado:

Vector3.SmoothDamp(...)
Quaternion.Slerp(...)

Dos AudioListener

Revisar cámaras activas y dejar un solo AudioListener activo.