using System.Collections.Generic; using System.Threading.Tasks; using Sirenix.OdinInspector; using Unity.Cinemachine; using UnityEngine; namespace DDD { public enum CameraType { None = 0, RestaurantBaseCamera = 1 } public class CameraManager : Singleton, IManager { [ShowInInspector, ReadOnly] private Dictionary _cameraGameObjects = new(); private CinemachineBrain _cinemachineBrain; private TaskCompletionSource _initializationTask = new(); private void OnDestroy() { var snapshot = new List(_cameraGameObjects.Values); foreach (var cameraGameObject in snapshot) { if (cameraGameObject) { UnRegisterCamera(cameraGameObject); } } } public void PreInit() { _cinemachineBrain = GetComponent(); } public Task Init() { return Task.CompletedTask; } public void PostInit() { var cameraGameObjects = FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None); foreach (var cameraGameObject in cameraGameObjects) { RegisterCamera(cameraGameObject); } _initializationTask.SetResult(true); } public void RegisterCamera(CameraGameObject cameraGameObject) { _cameraGameObjects.TryAdd(cameraGameObject.CameraType, cameraGameObject); } public void UnRegisterCamera(CameraGameObject cameraGameObject) { _cameraGameObjects.Remove(cameraGameObject.CameraType); } public void SwitchCamera(CameraType cameraType, CinemachineBlendDefinition.Styles blendStyle = CinemachineBlendDefinition.Styles.Cut, float blendDuration = 1f) { _cinemachineBrain.DefaultBlend = new CinemachineBlendDefinition(blendStyle, blendDuration); foreach (var item in _cameraGameObjects) { int newPriority = item.Value.CameraType == cameraType ? 10 : 0; item.Value.SetPriority(newPriority); } } public async Task GetCameraGameObject(CameraType cameraType) { await _initializationTask.Task; if (_cameraGameObjects.TryGetValue(cameraType, out var cameraGameObject)) { return cameraGameObject; } return null; } } }