using System.Collections.Generic; using Unity.Cinemachine; using UnityEngine; using UnityEngine.Rendering; public class AimCameraRig : CameraRigBase { [SerializeField] private CinemachineCamera _aimCamera; [SerializeField] private CinemachineCamera _freeCamera; //CameraRigBase에 전달용 private List _myCameras = new List(); protected override IReadOnlyList CameraCandidates => _myCameras; public CinemachineCamera ActiveCmCamera => LiveChild as CinemachineCamera; private bool _isAiming => _controller != null && _controller.IsAiming; private float _lastKnownFOV = 60f; protected override void Awake() { base.Awake(); _myCameras.Clear(); if (_aimCamera != null) _myCameras.Add(_aimCamera); if (_freeCamera != null) _myCameras.Add(_freeCamera); } protected override void Start() { base.Start(); if (_aimCamera == null || _freeCamera == null) { Debug.LogError($"{gameObject.name}: 프리팹 인스펙터에서 카메라 할당이 되지 않았습니다."); return; } CinemachineCamera topPriorityCam = GetHighestPriorityCamera() as CinemachineCamera; CinemachineCamera currentTargetCam = (LiveChild as CinemachineCamera) ?? topPriorityCam; if (currentTargetCam != null && currentTargetCam.Follow != null) { _controller = currentTargetCam.Follow.GetComponentInParent(); } if (_controller == null) { Debug.LogWarning($"현재 카메라의 Follow 대상을 찾을 수 없습니다."); } } public override void GetInputAxes(List axes) { base.GetInputAxes(axes); } protected override CinemachineVirtualCameraBase ChooseCurrentCamera(Vector3 worldUp, float deltaTime) { var oldCam = (CinemachineVirtualCameraBase)LiveChild; var newCam = _isAiming ? _aimCamera : _freeCamera; if (_controller != null && oldCam != newCam) { //에임모드에서 다시 돌아갈때 플레이어의 현재 회전값에 카메라를 일치시킴 if(newCam == _freeCamera) { CinemachineOrbitalFollow orbitalFollow = newCam.GetComponent(); orbitalFollow.HorizontalAxis.Recentering.Enabled = true; orbitalFollow.VerticalAxis.Recentering.Enabled = true; orbitalFollow.HorizontalAxis.Recentering.Enabled = false; orbitalFollow.VerticalAxis.Recentering.Enabled = false; } _controller.RecenterPlayer(); } return newCam; } public float CurrentFOV { get { if (ActiveCmCamera != null) _lastKnownFOV = ActiveCmCamera.Lens.FieldOfView; return _lastKnownFOV; } set { if (ActiveCmCamera != null) ActiveCmCamera.Lens.FieldOfView = value; } } }