86 lines
2.6 KiB
C#
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;
|
|
}
|
|
}
|
|
} |