using System; using System.Collections.Generic; using System.Threading.Tasks; using Sirenix.OdinInspector; using Unity.Cinemachine; using UnityEngine; using UnityEngine.SceneManagement; namespace DDD { public enum CameraType { BaseCam = 0, } public class CameraManager : Singleton { [ShowInInspector] private Dictionary _cameraDict; private CinemachineBrain _cinemachineBrain; protected override void OnAwake() { base.OnAwake(); _cinemachineBrain = GetComponent(); } private void Start() { SceneManager.sceneLoaded += OnSceneLoaded; } private void OnDestroy() { SceneManager.sceneLoaded -= OnSceneLoaded; } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { _ = RegisterCinemachineCamerasAsync(scene); } private async Task RegisterCinemachineCamerasAsync(Scene scene) { // 씬 로딩 직후는 Hierarchy 반영이 완료되지 않았을 수 있음 await Task.Yield(); // 다음 프레임까지 대기 var foundCams = FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None); _cameraDict.Clear(); foreach (var cam in foundCams) { if (Enum.TryParse(cam.name, out var type)) { if (!_cameraDict.TryAdd(type, cam)) Debug.LogWarning($"중복된 CameraType: {type}"); } else { Debug.LogWarning($"Enum에 없는 카메라 이름: {cam.name}"); } } Debug.Log("[CameraManager] 카메라 등록 완료"); if (scene.name == "01.Restaurant") { SwitchCamera(CameraType.BaseCam); } } public void SwitchCamera(CameraType cameraType, CinemachineBlendDefinition.Styles blendStyle = CinemachineBlendDefinition.Styles.Cut, float blendDuration = 1f) { _cinemachineBrain.DefaultBlend = new CinemachineBlendDefinition(blendStyle, blendDuration); foreach (var pair in _cameraDict) { pair.Value.Priority = (pair.Key == cameraType) ? 10 : 0; } } } }