using System; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEngine.AddressableAssets; namespace DDD { public class GameController : Singleton, IManager, IGameFlowHandler { [SerializeField] private AssetReference _gameData; [SerializeField] private AssetReference _gameState; public GameData GameData { get; private set; } public GameState GameState { get; private set; } private List _gameFlowControllers = new(); private static readonly List GameFlowControllerTypes = new(); public void PreInit() { RegisterFlowHandler(); } public async Task Init() { await LoadData(); await GameData.LoadData(); await GameState.LoadData(); await InitializeAllFlowControllers(); } public void PostInit() { } private void RegisterFlowHandler() { GameFlowManager.Instance.FlowHandlers.Add(this); } private async Task InitializeAllFlowControllers() { // Create controllers and initialize them foreach (var gameFlowControllerType in GameFlowControllerTypes) { // create new controllers from restaurantFlowControllerType var newController = ScriptableObject.CreateInstance(gameFlowControllerType); var newFlowController = newController as FlowController; _gameFlowControllers.Add(newFlowController); await newFlowController.InitializeController(); } foreach (var gameFlowController in _gameFlowControllers) { await gameFlowController.InitializeState(); } } private async Task LoadData() { var gameDataHandle = _gameData.LoadAssetAsync(); var gameStateHandle = _gameState.LoadAssetAsync(); await gameDataHandle.Task; await gameStateHandle.Task; GameData = gameDataHandle.Result; GameState = gameStateHandle.Result; Debug.Assert(GameData != null, "GameData is null"); Debug.Assert(GameState != null, "GameState is null"); await Task.CompletedTask; } public async Task OnReadyNewFlow(GameFlowState newFlowState) { List tasks = new List(); // Default initialization foreach (var gameFlowController in _gameFlowControllers) { tasks.Add(gameFlowController.OnReadyNewFlow(newFlowState)); } await Task.WhenAll(tasks); } public async Task OnExitCurrentFlow(GameFlowState exitingFlowState) { List tasks = new List(); foreach (var gameFlowController in _gameFlowControllers) { tasks.Add(gameFlowController.OnExitCurrentFlow(exitingFlowState)); } await Task.WhenAll(tasks); } } }