using System.Collections.Generic; using DDD.Managers; using DDD.ScriptableObjects; using Sirenix.OdinInspector; using UnityEngine; namespace DDD.Uis.Tycoon { public class CookMenuUi : PopupUi { [Title("프리팹")] [SerializeField] private TodayMenuButton _todayMenuButtonPrefab; [SerializeField] private CraftRecipeButton _craftRecipeButtonPrefab; [Title("컴포넌트")] [SerializeField] private GameObject _panel; [SerializeField] private GameObject _todayMenus; [SerializeField] private GameObject _unlockedCraftRecipes; [Title("클래스")] [SerializeField] private SelectedCraftRecipe _selectedCraftRecipe; [SerializeField] private AddIngredientUi _addIngredientUi; [Title("오늘의 메뉴")] [SerializeField] private int _maxTodayMenuCount = 6; [Title("실시간 데이터")] [SerializeField] private List _todayMenuButtons; [SerializeField] private List _craftRecipeButtons; [SerializeField] private TodayMenuButton _currentTodayMenuButton; [SerializeField] private CraftRecipeButton _currentCraftRecipeButton; private void Awake() { // 더미 데이터 삭제 foreach (Transform element in _todayMenus.transform) { if (element) { Destroy(element.gameObject); } } foreach (Transform element in _unlockedCraftRecipes.transform) { if (element) { Destroy(element.gameObject); } } } private void Start() { _todayMenuButtons = new List(_maxTodayMenuCount); for (int i = 0; i < _maxTodayMenuCount; i++) { TodayMenuButton todayMenuButton = Instantiate(_todayMenuButtonPrefab, _todayMenus.transform); todayMenuButton.RegisterButtonListener(() => OnClickedTodayMenu(todayMenuButton)); _todayMenuButtons.Add(todayMenuButton); } _craftRecipeButtons = new List(ItemManager.Instance.CraftRecipeDataSo.GetDataCount()); foreach (CraftRecipeData craftRecipeData in ItemManager.Instance.AcquiredCraftRecipeDatas.Values) { CraftRecipeButton craftRecipeButton = Instantiate(_craftRecipeButtonPrefab, _unlockedCraftRecipes.transform); craftRecipeButton.RegisterButtonListener(() => OnClickedCraftRecipe(craftRecipeData)); craftRecipeButton.SetCraftRecipeData(craftRecipeData); _craftRecipeButtons.Add(craftRecipeButton); } _selectedCraftRecipe.RegisterButtonListener(() => OnClickedAddIngredient(_selectedCraftRecipe.CurrentCraftRecipeData)); _addIngredientUi.RegisterButtonListener(() => OnAddedTodayMenu()); _panel.SetActive(false); } public override void Open() { if (_todayMenuButtons.Count > 0) { _currentTodayMenuButton = _todayMenuButtons[0]; } base.Open(); _panel.SetActive(true); if (_craftRecipeButtons.Count > 0) { UpdateCraftRecipeButton(); } } public override void Close() { _panel.SetActive(false); base.Close(); } private void OnClickedTodayMenu(TodayMenuButton clickedTodayMenuButton) { _currentTodayMenuButton = clickedTodayMenuButton; UpdateAddIngredientButton(); UpdateCraftRecipeButton(); } private void OnAddedTodayMenu() { _currentTodayMenuButton.AddedMenu(_addIngredientUi.CurrentCraftRecipeData, _addIngredientUi.CraftableCount); UpdateAddIngredientButton(); UpdateCraftRecipeButton(); } private void OnClickedCraftRecipe(CraftRecipeData craftRecipeData) { _selectedCraftRecipe.OnSelected(craftRecipeData); UpdateAddIngredientButton(); } private void OnClickedAddIngredient(CraftRecipeData craftRecipeData) { _addIngredientUi.OnClicked(craftRecipeData); } private void UpdateCraftRecipeButton() { _currentCraftRecipeButton = null; foreach (CraftRecipeButton craftRecipeButton in _craftRecipeButtons) { if (craftRecipeButton.gameObject.activeInHierarchy) { _currentCraftRecipeButton = craftRecipeButton; break; } } _currentCraftRecipeButton?.OnClicked(); } private void UpdateAddIngredientButton() { if (_currentTodayMenuButton.IsAddedMenu) { if (_currentTodayMenuButton.AddedCraftRecipeData.Idx == _selectedCraftRecipe.CurrentCraftRecipeData.Idx && _selectedCraftRecipe.IsCraftable) { _selectedCraftRecipe.EnableInteractableAddIngredientButton(); } else { _selectedCraftRecipe.DisableInteractableAddIngredientButton(); } // 추가된 메뉴에서는 추가 재료 버튼 비활성화 // 현재 메뉴에 등록된 레시피의 Idx를 가져옵니다. string currentRecipeIdx = _currentTodayMenuButton.AddedCraftRecipeData.Idx; // _craftRecipeButtons 중에서 현재 메뉴의 레시피와 동일한 Idx를 가진 버튼만 표시하고, 나머지는 숨깁니다. foreach (CraftRecipeButton button in _craftRecipeButtons) { bool shouldShow = (button.CraftRecipeData.Idx == currentRecipeIdx); button.gameObject.SetActive(shouldShow); } } else { if (_currentCraftRecipeButton == null) { _selectedCraftRecipe.DisableInteractableAddIngredientButton(); } else { // 현재 TodayMenuButton이 등록되지 않은 경우, // 선택된 레시피가 제작 가능한지 여부에 따라 추가 재료 버튼의 활성화 여부를 결정합니다. if (_selectedCraftRecipe.IsCraftable) { _selectedCraftRecipe.EnableInteractableAddIngredientButton(); } else { _selectedCraftRecipe.DisableInteractableAddIngredientButton(); } } // 이미 등록된 레시피의 Idx를 수집합니다. HashSet addedRecipeIdxSet = new HashSet(); foreach (TodayMenuButton todayMenuButton in _todayMenuButtons) { if (todayMenuButton.IsAddedMenu) { addedRecipeIdxSet.Add(todayMenuButton.AddedCraftRecipeData.Idx); } } // _craftRecipeButtons 중에서 등록되지 않은 레시피만 표시합니다. foreach (CraftRecipeButton button in _craftRecipeButtons) { bool shouldShow = !addedRecipeIdxSet.Contains(button.CraftRecipeData.Idx); button.gameObject.SetActive(shouldShow); } } } } }