using KBCore.Refs; using UnityEngine; namespace Infrastructure.Unity { public class CameraController : MonoBehaviour { [SerializeField] private Transform target; [SerializeField] private Vector3 offset = new(-20, 20, -20); [SerializeField] private float smoothSpeed = 5f; private Vector3 _originalPos; // This field is declared but not used in the provided LateUpdate logic. private float _shakeTimer; private float _shakeMagnitude; private void LateUpdate() { if (!target) return; // We follow the player, but we might want to clamp X/Z movement // so the camera doesn't jitter too much, only tracking Y (falling). // For a dynamic feel, let's track everything loosely. var targetPos = target.position + offset; var smoothPos = Vector3.Lerp(transform.position, targetPos, smoothSpeed * Time.deltaTime); if (_shakeTimer > 0) { _shakeTimer -= Time.deltaTime; var shakeOffset = Random.insideUnitSphere * _shakeMagnitude; transform.position = smoothPos + shakeOffset; } else { transform.position = smoothPos; } } public void SetTarget(Transform newTarget) { target = newTarget; } public void Shake(float duration, float magnitude) { _shakeTimer = duration; _shakeMagnitude = magnitude; } public void ShakeLight() => Shake(.1f, .1f); public void ShakeMedium() => Shake(.15f, .3f); public void ShakeHeavy() => Shake(.1f, .5f); } }