ProjectDDD/Assets/_DDD/_Scripts/RestaurantController/RestaurantController.cs
NTG 6d9e7a7f51 data, state 관리 로직 전부 수정
ScriptableSingleton 모두 삭제
2025-08-18 19:48:36 +09:00

112 lines
3.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
namespace DDD
{
public class RestaurantController : Singleton<RestaurantController>, IManager, IGameFlowHandler
{
[SerializeField] private AssetReference _restaurantData;
[SerializeField] private AssetReference _restaurantState;
public RestaurantData RestaurantData { get; private set; }
public RestaurantState RestaurantState { get; private set; }
private List<FlowController> _restaurantFlowControllers = new();
// static definitions
private static readonly List<Type> RestaurantFlowControllerTypes = new()
{
typeof(RestaurantPlayerController),
typeof(RestaurantEnvironmentController),
typeof(RestaurantManagementController),
typeof(RestaurantRunController),
typeof(RestaurantGlobalMessageController)
};
public void PreInit()
{
RegisterFlowHandler();
}
public async Task Init()
{
await LoadData();
await RestaurantData.LoadData();
await RestaurantState.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 restaurantFlowControllerType in RestaurantFlowControllerTypes)
{
// create new controllers from restaurantFlowControllerType
var newController = ScriptableObject.CreateInstance(restaurantFlowControllerType);
var newFlowController = newController as FlowController;
_restaurantFlowControllers.Add(newFlowController);
await newFlowController.InitializeController();
}
foreach (var restaurantFlowController in _restaurantFlowControllers)
{
await restaurantFlowController.InitializeState();
}
}
private async Task LoadData()
{
var restaurantDataHandle = _restaurantData.LoadAssetAsync<RestaurantData>();
var restaurantStateHandle = _restaurantState.LoadAssetAsync<RestaurantState>();
await restaurantDataHandle.Task;
await restaurantStateHandle.Task;
RestaurantData = restaurantDataHandle.Result;
RestaurantState = restaurantStateHandle.Result;
Debug.Assert(RestaurantData != null, "RestaurantData is null");
Debug.Assert(RestaurantState != null, "RestaurantState is null");
}
public async Task OnReadyNewFlow(GameFlowState newFlowState)
{
List<Task> tasks = new List<Task>();
// Default restaurant initialization
if (newFlowState == GameFlowState.ReadyForRestaurant)
{
// Switch keymap
InputManager.Instance.SwitchCurrentActionMap(InputActionMaps.Restaurant);
}
// Restaurant FlowControllers - Player, Environment, Management, Run, ...
foreach (var flowController in _restaurantFlowControllers)
{
tasks.Add(flowController.OnReadyNewFlow(newFlowState));
}
await Task.WhenAll(tasks);
}
public async Task OnExitCurrentFlow(GameFlowState exitingFlowState)
{
List<Task> tasks = new List<Task>();
foreach (var flowController in _restaurantFlowControllers)
{
tasks.Add(flowController.OnExitCurrentFlow(exitingFlowState));
}
await Task.WhenAll(tasks);
}
}
}