using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class ShopSystem : MonoBehaviour
{
public enum ItemStatus
{
PURCHASEABLE,
NOT_IN_USE,
IN_USE
}
[SerializeField] int curr_Wallpaper;
[SerializeField] int curr_Floor;
[SerializeField] int curr_Couch;
[SerializeField] int curr_CatTree;
[SerializeField] GameManager gm;
// the in-game items that will change
[SerializeField] Image WallpaperImage;
[SerializeField] Image FloorImage;
[SerializeField] Image CouchImage;
[SerializeField] Image CatTreeImage;
[System.Serializable] public class ShopItem
{
public Sprite Icon;
public int Paws;
public bool IsPurchased = false;
public ItemStatus status = ItemStatus.PURCHASEABLE;
}
// can be edited in the scrollview component of the inspector
[SerializeField] List<ShopItem> WallpaperList;
[SerializeField] List<ShopItem> FloorList;
[SerializeField] List<ShopItem> CouchList;
[SerializeField] List<ShopItem> CatTreeList;
GameObject ItemTemplate;
GameObject g;
[SerializeField] GameObject Wallpaper;
[SerializeField] GameObject Floor;
[SerializeField] GameObject Couch;
[SerializeField] GameObject CatTree;
[SerializeField] Transform WallpaperContent;
[SerializeField] Transform FloorContent;
[SerializeField] Transform CouchContent;
[SerializeField] Transform CatTreeContent;
Button buyButton;
public enum ShopTabs
{
WALLPAPER,
FLOOR,
COUCH,
CAT_TREE
}
[SerializeField] Button wallpaperButton;
[SerializeField] Button floorButton;
[SerializeField] Button couchButton;
[SerializeField] Button catTreeButton;
private string saveFilePath;
void Awake()
{
saveFilePath = Path.Combine(Application.persistentDataPath, "ShopData.json");
}
void Start()
{
// set up for whenever the tab buttons are pressed
wallpaperButton.AddEventListener(ShopTabs.WALLPAPER, OnShopTabButtonClicked);
floorButton.AddEventListener(ShopTabs.FLOOR, OnShopTabButtonClicked);
couchButton.AddEventListener(ShopTabs.COUCH, OnShopTabButtonClicked);
catTreeButton.AddEventListener(ShopTabs.CAT_TREE, OnShopTabButtonClicked);
// call functions to create shop
LoadShopData(); // reads data from json file
PopulateShop(); // creates the items
// allows data from previous play through to be read on game start up
gm.CloseShopPage();
// link up assets
WallpaperImage.sprite = WallpaperList[curr_Wallpaper].Icon;
FloorImage.sprite = FloorList[curr_Floor].Icon;
CouchImage.sprite = CouchList[curr_Couch].Icon;
CatTreeImage.sprite = CatTreeList[curr_CatTree].Icon;
}
public void PopulateShop()
{
// get the template for reference
ItemTemplate = WallpaperContent.GetChild(0).gameObject;
// create specific items for each tab
curr_Wallpaper = PopulateItems(WallpaperList, WallpaperContent, curr_Wallpaper, WallpaperImage);
curr_Floor = PopulateItems(FloorList, FloorContent, curr_Floor, FloorImage);
curr_Couch = PopulateItems(CouchList, CouchContent, curr_Couch, CouchImage);
curr_CatTree = PopulateItems(CatTreeList, CatTreeContent, curr_CatTree, CatTreeImage);
// destroy template after creating items
Destroy(ItemTemplate);
}
int PopulateItems(List<ShopItem> itemList, Transform content, int currentItem, Image image)
{
// get amount of items in the list that exists
int amountOfItems = itemList.Count;
for (int i = 0; i < amountOfItems; i++)
{
// use template to create the item
g = Instantiate(ItemTemplate, content);
if (itemList[i] != null)
{
//set icon of the item being constructed
g.transform.GetChild(0).GetComponent<Image>().sprite = itemList[i].Icon;
}
// set cost of the item
g.transform.GetChild(1).GetChild(0).GetComponent<TextMeshProUGUI>().text = itemList[i].Paws.ToString();
// get the buy button
buyButton = g.transform.GetChild(2).GetComponent<Button>();
if (itemList[i].status == ItemStatus.PURCHASEABLE)
{
// item is interactable if not yet purchased
buyButton.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = "BUY";
buyButton.interactable = true;
}
else if (itemList[i].status == ItemStatus.NOT_IN_USE)
{
// item is also interactable if not currently in use
buyButton.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = "NOT IN USE";
buyButton.interactable = true;
}
else if (itemList[i].status == ItemStatus.IN_USE)
{
// NOT interactable if already being used
buyButton.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = "IN USE";
buyButton.interactable = false;
currentItem = i;
image.sprite = content.GetChild(currentItem).GetChild(0).GetComponent<Image>().sprite;
}
int index = i;
// add a listener to the buy button
buyButton.onClick.AddListener(() => OnShopItemButtonClicked(index, itemList, content, image, ref currentItem));
}
return currentItem;
}
void Update()
{
if (wallpaperButton.interactable == false)
{
// only look at wallpaper section
Wallpaper.SetActive(true);
Floor.SetActive(false);
Couch.SetActive(false);
CatTree.SetActive(false);
}
else if (floorButton.interactable == false)
{
// only look at floor section
Wallpaper.SetActive(false);
Floor.SetActive(true);
Couch.SetActive(false);
CatTree.SetActive(false);
}
else if (couchButton.interactable == false)
{
// only look at couch section
Wallpaper.SetActive(false);
Floor.SetActive(false);
Couch.SetActive(true);
CatTree.SetActive(false);
}
else if (catTreeButton.interactable == false)
{
// only look at cat tree section
Wallpaper.SetActive(false);
Floor.SetActive(false);
Couch.SetActive(false);
CatTree.SetActive(true);
}
}
void OnShopItemButtonClicked(int itemIndex, List<ShopItem> itemList, Transform content, Image image, ref int curr_item)
{
// player has enough paws and item can be bought
if (gm.GetPaws() >= itemList[itemIndex].Paws && itemList[itemIndex].status == ItemStatus.PURCHASEABLE)
{
// charge player paws
gm.LosePaws(itemList[itemIndex].Paws);
//purchase item
itemList[itemIndex].IsPurchased = true;
// get buy button of the item and change status to reflect action
buyButton = content.GetChild(itemIndex).GetChild(2).GetComponent<Button>();
buyButton.interactable = true;
buyButton.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = "NOT IN USE";
itemList[itemIndex].status = ItemStatus.NOT_IN_USE;
}
else if (itemList[itemIndex].status == ItemStatus.NOT_IN_USE)
{
// revert the status for the one previously in use
for (int i = 0; i < itemList.Count; i++)
{
// if it says in use and is not the one player just picked
if (itemList[i].status == ItemStatus.IN_USE)
{
itemList[i].status = ItemStatus.NOT_IN_USE;
// change button settings
buyButton = content.GetChild(i).GetChild(2).GetComponent<Button>();
buyButton.interactable = true;
buyButton.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = "NOT IN USE";
}
}
// set the item to IN USE
itemList[itemIndex].status = ItemStatus.IN_USE;
buyButton = content.GetChild(itemIndex).GetChild(2).GetComponent<Button>();
// player can no longer interact with this button
buyButton.interactable = false;
buyButton.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = "IN USE";
curr_item = itemIndex;
// change wallpaper of the game
// get the Icon image of the item listing
image.sprite = content.GetChild(itemIndex).GetChild(0).GetComponent<Image>().sprite;
SaveShopData();
}
}
void OnShopTabButtonClicked(ShopTabs tabNum)
{
if (tabNum == ShopTabs.WALLPAPER)
{
wallpaperButton.interactable = false;
floorButton.interactable = true;
couchButton.interactable = true;
catTreeButton.interactable = true;
}
else if (tabNum == ShopTabs.FLOOR)
{
wallpaperButton.interactable = true;
floorButton.interactable = false;
couchButton.interactable = true;
catTreeButton.interactable = true;
}
else if (tabNum == ShopTabs.COUCH)
{
wallpaperButton.interactable = true;
floorButton.interactable = true;
couchButton.interactable = false;
catTreeButton.interactable = true;
}
else if (tabNum == ShopTabs.CAT_TREE)
{
wallpaperButton.interactable = true;
floorButton.interactable = true;
couchButton.interactable = true;
catTreeButton.interactable = false;
}
}
// save data into json file
public void SaveShopData()
{
ShopData data = new ShopData();
// which item is currently in use
data.curr_Wallpaper = curr_Wallpaper;
data.curr_Floor = curr_Floor;
data.curr_Couch = curr_Couch;
data.curr_CatTree = curr_CatTree;
foreach (var item in WallpaperList)
{
data.WallpaperList.Add(new ShopItemData(GetIconPath(ShopTabs.WALLPAPER, item.Icon), item.Paws, item.IsPurchased, item.status));
}
foreach (var item in FloorList)
{
data.FloorList.Add(new ShopItemData(GetIconPath(ShopTabs.FLOOR, item.Icon), item.Paws, item.IsPurchased, item.status));
}
foreach (var item in CouchList)
{
data.CouchList.Add(new ShopItemData(GetIconPath(ShopTabs.COUCH, item.Icon), item.Paws, item.IsPurchased, item.status));
}
foreach (var item in CatTreeList)
{
data.CatTreeList.Add(new ShopItemData(GetIconPath(ShopTabs.CAT_TREE, item.Icon), item.Paws, item.IsPurchased, item.status));
}
// write all the lists into json file
string shopData = JsonUtility.ToJson(data, true);
File.WriteAllText(saveFilePath, shopData);
}
private string GetIconPath(ShopTabs itemType, Sprite icon)
{
if (icon != null)
{
if (itemType == ShopTabs.WALLPAPER)
{
return "Shop_Wallpaper/" + icon.name;
}
else if (itemType == ShopTabs.FLOOR)
{
return "Shop_Floor/" + icon.name;
}
else if (itemType == ShopTabs.COUCH)
{
return "Shop_Couch/" + icon.name;
}
else if (itemType == ShopTabs.CAT_TREE)
{
return "Shop_CatTree/" + icon.name;
}
}
return "";
}
// load in shop data
public void LoadShopData()
{
// check if file exists to pull from
if (File.Exists(saveFilePath))
{
//read in pre-existing data if it exists
string json = File.ReadAllText(saveFilePath);
ShopData data = JsonUtility.FromJson<ShopData>(json);
curr_Wallpaper = data.curr_Wallpaper;
curr_Floor = data.curr_Floor;
curr_Couch = data.curr_Couch;
curr_CatTree = data.curr_CatTree;
// fill in for wallpaper list
WallpaperList = new List<ShopItem>();
foreach (var itemData in data.WallpaperList)
{
// load the sprite in using the icon path
var sprite = Resources.Load<Sprite>(itemData.IconPath);
var item = new ShopItem() { Icon = sprite, Paws = itemData.Paws, IsPurchased = itemData.IsPurchased, status = (ItemStatus)System.Enum.Parse(typeof(ItemStatus), itemData.Status) };
WallpaperList.Add(item);
}
// fill in for floor list
FloorList = new List<ShopItem>();
foreach (var itemData in data.FloorList)
{
// load the sprite in using the icon path
var sprite = Resources.Load<Sprite>(itemData.IconPath);
var item = new ShopItem() { Icon = sprite, Paws = itemData.Paws, IsPurchased = itemData.IsPurchased, status = (ItemStatus)System.Enum.Parse(typeof(ItemStatus), itemData.Status) };
FloorList.Add(item);
}
CouchList = new List<ShopItem>();
foreach (var itemData in data.CouchList)
{
var sprite = Resources.Load<Sprite>(itemData.IconPath);
var item = new ShopItem() { Icon = sprite, Paws = itemData.Paws, IsPurchased = itemData.IsPurchased, status = (ItemStatus)System.Enum.Parse(typeof(ItemStatus), itemData.Status) };
CouchList.Add(item);
}
CatTreeList = new List<ShopItem>();
foreach (var itemData in data.CatTreeList)
{
var sprite = Resources.Load<Sprite>(itemData.IconPath);
var item = new ShopItem() { Icon = sprite, Paws = itemData.Paws, IsPurchased = itemData.IsPurchased, status = (ItemStatus)System.Enum.Parse(typeof(ItemStatus), itemData.Status) };
CatTreeList.Add(item);
}
}
else
{
// create json file if it doesnt exist
SaveShopData();
}
}
void OnApplicationQuit()
{
// save current data to json file
SaveShopData();
}
}
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter