using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEngine.AddressableAssets; namespace DDD { public class TodayMenuView : MonoBehaviour, IEventHandler, IEventHandler { [SerializeField] private Transform _todayFoodContent; [SerializeField] private Transform _todayDrinkContent; private List _foodSlots; private List _drinkSlots; private RestaurantManagementSo _restaurantManagementSo; private void Start() { _ = Initialize(); } private void OnDestroy() { EventBus.Unregister(this); EventBus.Unregister(this); } private async Task Initialize() { _restaurantManagementSo = await AssetManager.LoadAsset(DataConstants.RestaurantManagementSo); Debug.Assert(_restaurantManagementSo != null, "_restaurantManagementSo != null"); foreach (Transform child in _todayFoodContent) { Destroy(child.gameObject); } int maxFoodCount = _restaurantManagementSo.MaxFoodCount; _foodSlots = new List(maxFoodCount); for (int i = 0; i < _restaurantManagementSo.MaxFoodCount; i++) { var go = Instantiate(_restaurantManagementSo.ItemSlotUiPrefab, _todayFoodContent); var slot = go.GetComponent(); await slot.Initialize(null, new TodayMenuSlotUiStrategy(RecipeType.FoodRecipe)); var todayMenuInteractor = go.GetComponent(); todayMenuInteractor.Initialize(TodayMenuEventType.Remove); _foodSlots.Add(slot); } foreach (Transform child in _todayDrinkContent) { Destroy(child.gameObject); } int maxDrinkCount = _restaurantManagementSo.MaxDrinkCount; _drinkSlots = new List(maxDrinkCount); for (int i = 0; i < _restaurantManagementSo.MaxDrinkCount; i++) { var go = Instantiate(_restaurantManagementSo.ItemSlotUiPrefab, _todayDrinkContent); var slot = go.GetComponent(); await slot.Initialize(null, new TodayMenuSlotUiStrategy(RecipeType.DrinkRecipe)); var todayMenuInteractor = go.GetComponent(); todayMenuInteractor.Initialize(TodayMenuEventType.Remove); _drinkSlots.Add(slot); } UpdateView(); EventBus.Register(this); EventBus.Register(this); } public void Invoke(TodayMenuAddedEvent evt) { UpdateView(); } public void Invoke(TodayMenuRemovedEvent evt) { UpdateView(); } private void UpdateView() { int foodIndex = 0; foreach (var kvp in _restaurantManagementSo.FoodRecipeIds) { if (foodIndex >= _foodSlots.Count) break; string recipeId = kvp.Key; var model = ItemViewModelFactory.CreateByRecipeId(recipeId); var foodSlot = _foodSlots[foodIndex]; _ = foodSlot.Initialize(model, new TodayMenuSlotUiStrategy(RecipeType.FoodRecipe)); foodSlot.SetCount(kvp.Value); foodIndex++; } for (int i = foodIndex; i < _foodSlots.Count; i++) { _ = _foodSlots[i].Initialize(null, new TodayMenuSlotUiStrategy(RecipeType.FoodRecipe)); } int drinkIndex = 0; foreach (var kvp in _restaurantManagementSo.DrinkRecipeIds) { if (drinkIndex >= _drinkSlots.Count) break; string recipeId = kvp.Key; var model = ItemViewModelFactory.CreateByRecipeId(recipeId); var drinkSlot = _drinkSlots[drinkIndex]; _ = drinkSlot.Initialize(model, new TodayMenuSlotUiStrategy(RecipeType.DrinkRecipe)); drinkSlot.SetCount(kvp.Value); drinkIndex++; } for (int i = drinkIndex; i < _drinkSlots.Count; i++) { _ = _drinkSlots[i].Initialize(null, new TodayMenuSlotUiStrategy(RecipeType.DrinkRecipe)); } } } }