Initial commit
This commit is contained in:
159
Assets/Scripts/ShopManager.cs
Normal file
159
Assets/Scripts/ShopManager.cs
Normal file
@@ -0,0 +1,159 @@
|
||||
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}";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user