ProjectDDD/Assets/_Datas/02.Scripts/Controllers/CameraManager.cs
2025-07-01 19:47:26 +09:00

83 lines
2.5 KiB (Stored with Git LFS)
C#

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<CameraManager>
{
[ShowInInspector]
private Dictionary<CameraType, CinemachineCamera> _cameraDict;
private CinemachineBrain _cinemachineBrain;
protected override void OnAwake()
{
base.OnAwake();
_cinemachineBrain = GetComponent<CinemachineBrain>();
}
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<CinemachineCamera>(FindObjectsInactive.Include, FindObjectsSortMode.None);
_cameraDict.Clear();
foreach (var cam in foundCams)
{
if (Enum.TryParse<CameraType>(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;
}
}
}
}