using UnityEngine; namespace OnlyScove.Scripts { public class CameraController : MonoBehaviour { [SerializeField] InputReader inputReader; [SerializeField] Transform followTarget; [SerializeField] float positionSmoothTime = 0.12f; [SerializeField] float rotationSmoothTime = 5f; [SerializeField] Vector2 framingOffset; [Header("Components")] [SerializeField] private CameraRotationHandler rotationHandler = new CameraRotationHandler(); [SerializeField] private CameraZoomHandler zoomHandler = new CameraZoomHandler(); [SerializeField] private CameraCollisionHandler collisionHandler = new CameraCollisionHandler(); [SerializeField] private CameraOcclusionTransparency occlusionTransparency = new CameraOcclusionTransparency(); [SerializeField] private CameraDynamicFOV dynamicFOV = new CameraDynamicFOV(); [SerializeField] private CameraCharacterFading characterFading = new CameraCharacterFading(); [SerializeField] private CameraSideBias sideBias = new CameraSideBias(); [SerializeField] private CameraShakeManager shakeManager = new CameraShakeManager(); private Vector3 _currentVelocity; private Camera _cam; private void Start() { _cam = GetComponent(); Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; rotationHandler.Initialize(transform); } private void Update() { // Handle Input-related updates first if (inputReader != null) { rotationHandler.HandleRotation(inputReader, followTarget, rotationSmoothTime); zoomHandler.HandleZoom(inputReader); sideBias.HandleSideBias(inputReader); dynamicFOV.HandleDynamicFOV(_cam, inputReader); } // Update camera rotation transform.rotation = rotationHandler.CurrentRotation; // Calculate focus position with framing offset and side bias Vector3 focusPosition = followTarget.position + rotationHandler.CurrentRotation * new Vector3(framingOffset.x + sideBias.CurrentSideBias, framingOffset.y, 0); // Handle collision float targetDistance = collisionHandler.CheckCollision(focusPosition, rotationHandler.CurrentRotation, zoomHandler.CurrentDistance, zoomHandler.MinDistance); // Handle character fading characterFading.HandleCharacterFading(targetDistance); // Calculate target position Vector3 targetPosition = focusPosition - rotationHandler.CurrentRotation * new Vector3(0, 0, targetDistance); // Handle camera shake shakeManager.HandleShake(); // Apply final position and rotation transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref _currentVelocity, positionSmoothTime) + shakeManager.ShakeOffset; // Handle occlusion transparency (needs camera's final position and rotation) occlusionTransparency.HandleTransparency(transform, focusPosition); } public void Shake(float intensity, float duration) { shakeManager.Shake(intensity, duration); } public void TriggerFallImpactShake(float fallHeight) { shakeManager.TriggerFallImpactShake(fallHeight); } public Quaternion PlanarRotation => rotationHandler.PlanarRotation; } }