using System.Collections; using System.Collections.Generic; using Cinemachine; using Sirenix.OdinInspector; using UnityEngine; // ReSharper disable once CheckNamespace namespace BlueWaterProject { public class OceanCamera : MonoBehaviour { [Title("초기화 방식")] [SerializeField] private bool autoInit = true; [field: Title("카메라")] [field: SerializeField] public CinemachineVirtualCamera BaseShipCam { get; private set; } private List cineCamList; private GameObject cineCams; private CinemachineFramingTransposer framingTransposer; private Coroutine distanceCoroutine; private float defaultDistance; private const int CINE_CAM_NUM = 1; private void Awake() { if (autoInit) { Init(); } CameraManager.Inst.OceanCamera = this; CameraManager.Inst.MainCam = Camera.main; } [Button("셋팅 초기화")] private void Init() { cineCams = GameObject.Find("CineCameras"); if (!cineCams) { Debug.LogError("cineCams is null error"); return; } BaseShipCam = cineCams.transform.Find("BaseShipCam")?.GetComponent(); if (!BaseShipCam) { Debug.LogError("BaseShipCam is null error"); return; } framingTransposer = BaseShipCam.GetCinemachineComponent(); defaultDistance = framingTransposer.m_CameraDistance; cineCamList = new List(CINE_CAM_NUM) { BaseShipCam }; foreach (var cam in cineCamList) { cam.Priority = 0; } BaseShipCam.Priority = 1; CameraManager.Inst.MainCam = Camera.main; } public void ChangeDistance(float addDistance, float time) { if (distanceCoroutine != null) { StopCoroutine(distanceCoroutine); } distanceCoroutine = StartCoroutine(ChangeDistanceCoroutine(addDistance, time)); } private IEnumerator ChangeDistanceCoroutine(float addDistance, float time) { var changeDistance = framingTransposer.m_CameraDistance + addDistance; var updateTime = 0f; while (updateTime < time) { updateTime += Time.deltaTime; framingTransposer.m_CameraDistance = Mathf.Lerp(framingTransposer.m_CameraDistance, changeDistance, updateTime / time); yield return null; } yield return null; } public void DefaultDistance(float time) { if (distanceCoroutine != null) { StopCoroutine(distanceCoroutine); } distanceCoroutine = StartCoroutine(DefaultDistanceCoroutine(time)); } private IEnumerator DefaultDistanceCoroutine(float time) { var updateTime = 0f; while (updateTime < time) { updateTime += Time.deltaTime; framingTransposer.m_CameraDistance = Mathf.Lerp(framingTransposer.m_CameraDistance, defaultDistance, updateTime / time); yield return null; } framingTransposer.m_CameraDistance = defaultDistance; yield return null; } } }