Files
ShopGame/Assets/Scripts/ShopManager.cs
2025-12-17 17:34:04 +00:00

159 lines
4.6 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using TMPro;
public class ShopManager : MonoBehaviour
{
[Header("Shop Settings")]
public int startingMoney = 100;
public Item[] availableItems; // Assumes Item is a MonoBehaviour attached to a Prefab
[Header("UI Elements")]
public TMP_Text moneyText;
public Button[] buyButtons;
[Header("Inventory Settings")]
public Transform storeRoomTransform; // Where physical items spawn
public Transform inventoryUI; // The Panel with the Grid Layout Group
public GameObject inventoryTextTemplate; // Drag a Prefab with TMP_Text here!
private int currentMoney;
private Dictionary<string, int> inventory = new Dictionary<string, int>();
void Start()
{
currentMoney = startingMoney;
// Initialize dictionary once at start
PopulateInventoryDictionary();
InitializeShopButtons();
UpdateAllUI();
}
void InitializeShopButtons()
{
for (int i = 0; i < buyButtons.Length; i++)
{
if (i < availableItems.Length)
{
int index = i;
Item item = availableItems[index];
Button button = buyButtons[index];
// Set Button Text
TMP_Text btnText = button.GetComponentInChildren<TMP_Text>();
if (btnText != null)
{
btnText.text = $"{item.itemName} - ${item.itemPrice}";
}
// Add Click Listener
button.onClick.RemoveAllListeners();
button.onClick.AddListener(() => BuyItem(item, button));
}
else
{
buyButtons[i].gameObject.SetActive(false);
}
}
}
void BuyItem(Item item, Button button)
{
if (currentMoney >= item.itemPrice)
{
// 1. Deduct Money
currentMoney -= item.itemPrice;
// 2. Instantiate physical item in the game world
if(item.gameObject != null)
{
Instantiate(item.gameObject, storeRoomTransform.position, Quaternion.identity);
}
// 3. Logic: Add to dictionary
if (!inventory.ContainsKey(item.itemName))
{
inventory[item.itemName] = 0;
}
inventory[item.itemName]++;
Debug.Log($"Purchased {item.itemName}");
// 4. Update Button Feedback (Optional)
TMP_Text btnText = button.GetComponentInChildren<TMP_Text>();
if (btnText != null)
{
// Temporarily show "Bought" or keep price?
// Usually shops keep the price so you can buy again.
// If you want it to flash green, you'd need a Coroutine,
// but for now let's keep it simple.
}
// 5. Refresh UI
UpdateAllUI();
}
else
{
Debug.Log("Not enough money!");
}
}
void UpdateAllUI()
{
// Update Money Text
moneyText.text = "Money: $" + currentMoney;
// Update Button Interactability
for (int i = 0; i < buyButtons.Length; i++)
{
if (i < availableItems.Length)
{
buyButtons[i].interactable = (currentMoney >= availableItems[i].itemPrice);
}
}
// Update Inventory List
UpdateInventoryUI();
}
void PopulateInventoryDictionary()
{
foreach (Item item in availableItems)
{
if (!inventory.ContainsKey(item.itemName))
{
inventory[item.itemName] = 0;
}
}
}
void UpdateInventoryUI()
{
// 1. Clear existing list items
foreach (Transform child in inventoryUI)
{
Destroy(child.gameObject);
}
// 2. Create new list items from the Template
foreach (KeyValuePair<string, int> entry in inventory)
{
// Only show items we actually have (Count > 0)
if(entry.Value > 0)
{
// Instantiate the Template (which has the TMP_Text component)
GameObject newItem = Instantiate(inventoryTextTemplate, inventoryUI);
// Get the text component and set the string
TMP_Text textComp = newItem.GetComponent<TMP_Text>();
if (textComp != null)
{
textComp.text = $"{entry.Key}: {entry.Value}";
}
}
}
}
}