ProjectDDD/Assets/_DDD/_Scripts/GameController/GameController.cs
2025-08-19 12:12:10 +09:00

101 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
namespace DDD
{
public class GameController : Singleton<GameController>, IManager, IGameFlowHandler
{
[SerializeField] private AssetReference _gameData;
public GameData GameData { get; private set; }
public GameState GameState { get; private set; }
private List<FlowController> _gameFlowControllers = new();
private static readonly List<Type> GameFlowControllerTypes = new();
public void PreInit()
{
LoadOrCreateRestaurantState();
RegisterFlowHandler();
}
public async Task Init()
{
await LoadData();
await GameData.LoadData();
await InitializeAllFlowControllers();
}
public void PostInit()
{
}
private void LoadOrCreateRestaurantState()
{
// TODO : Load states from saved files. if none, create them.
GameState = ScriptableObject.CreateInstance<GameState>();
}
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<GameData>();
await gameDataHandle.Task;
GameData = gameDataHandle.Result;
Debug.Assert(GameData != null, "GameData is null");
await Task.CompletedTask;
}
public async Task OnReadyNewFlow(GameFlowState newFlowState)
{
List<Task> tasks = new List<Task>();
// Default initialization
foreach (var gameFlowController in _gameFlowControllers)
{
tasks.Add(gameFlowController.OnReadyNewFlow(newFlowState));
}
await Task.WhenAll(tasks);
}
public async Task OnExitCurrentFlow(GameFlowState exitingFlowState)
{
List<Task> tasks = new List<Task>();
foreach (var gameFlowController in _gameFlowControllers)
{
tasks.Add(gameFlowController.OnExitCurrentFlow(exitingFlowState));
}
await Task.WhenAll(tasks);
}
}
}