using System; using Core; using DG.Tweening; using Sirenix.OdinInspector; using UnityEngine; namespace Systems { public class CameraController : SystemBase { [SerializeField] private Camera mainCam; private Transform _cameraTransform; [BoxGroup("Camera Settings")] [SerializeField] private Vector3 cameraPosition; [BoxGroup("Camera Settings")] [SerializeField] private Quaternion cameraRotation; [BoxGroup("Transition Settings")] [SerializeField] private float transitionSpeed; [BoxGroup("Transition Settings")] [SerializeField] private Ease transitionEase; [BoxGroup("Shake Settings")] [SerializeField] private float shakeDuration = .25f; [BoxGroup("Shake Settings")] [SerializeField] private float shakeStrength = .1f; protected override void ReleaseReferences() { mainCam = null; _cameraTransform = null; } public override void Initialize() { _cameraTransform = mainCam.transform; } public void PlayCameraTransition(Action onStart = null) { _cameraTransform.DORotateQuaternion(cameraRotation, transitionSpeed) .SetEase(transitionEase); _cameraTransform.DOMove(cameraPosition, transitionSpeed) .SetEase(transitionEase) .OnComplete(() => onStart?.Invoke()); } public void PlayCameraShake(float inStrength = -1f) { var strength = (inStrength > 0) ? inStrength : shakeStrength; _cameraTransform.DOShakePosition(shakeDuration, strength); _cameraTransform.DOShakeRotation(shakeDuration, strength); } public Vector3 GetViewPoint(Vector3 inWorldPos) => mainCam.WorldToViewportPoint(inWorldPos); } }