ProjectDDD/Assets/_DDD/_Scripts/CameraSystem/CameraManager.cs
2025-08-17 15:02:28 +09:00

86 lines
2.6 KiB
C#

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<CameraManager>, IManager
{
[ShowInInspector, ReadOnly]
private Dictionary<CameraType, CameraGameObject> _cameraGameObjects = new();
private CinemachineBrain _cinemachineBrain;
private TaskCompletionSource<bool> _initializationTask = new();
private void OnDestroy()
{
foreach (var cameraGameObject in _cameraGameObjects.Values)
{
if (cameraGameObject)
{
UnRegisterCamera(cameraGameObject);
}
}
}
public void PreInit()
{
_cinemachineBrain = GetComponent<CinemachineBrain>();
}
public Task Init()
{
return Task.CompletedTask;
}
public void PostInit()
{
var cameraGameObjects = FindObjectsByType<CameraGameObject>(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<CameraGameObject> GetCameraGameObject(CameraType cameraType)
{
await _initializationTask.Task;
if (_cameraGameObjects.TryGetValue(cameraType, out var cameraGameObject))
{
return cameraGameObject;
}
return null;
}
}
}