Hello, I am displaying a UI when I click on a building.
Each building produces different items, what items can be produced are displayed on the UI.
I’ve made it so that in the GameObject list, I store the UI panel object with the object.
In OnEnable I’m destroy elements of this list and creating a new for given building. I’m not sure if this is the right way, if not I would ask for a better pattern.
Building class:
public class Building : MonoBehaviour
{
public List<Item> itemsToCraft = new List<Item>();
private void OnMouseDown()
{
Debug.Log("Clicked building " + gameObject);
UIManager.Instance.ShowBuildingUI();
UIManager.Instance._buildingUI.Init(itemsToCraft);
}
}
BuildingUI class:
public class BuildingUI : MonoBehaviour
{
[SerializeField] private GameObject itemsToCraftContainer;
[SerializeField] private GameObject itemToCraftPrefab;
private List<GameObject> createdPanels;
private List<Item> _items;
public void Init(List<Item> items)
{
_items = items;
createdPanels = new List<GameObject>();
CreatePanels();
}
private void OnEnable()
{
if (_items != null)
CreatePanels();
}
private void CreatePanels()
{
if (createdPanels != null)
{
foreach (GameObject createdPanel in createdPanels)
Destroy(createdPanel);
createdPanels.Clear();
}
foreach (Item item in _items)
{
GameObject itemToCraftObject = Instantiate(itemToCraftPrefab, itemsToCraftContainer.transform);
itemToCraftObject.GetComponent<ItemCraftUI>().Init(item.ItemName);
createdPanels.Add(itemToCraftObject);
}
}
}
ItemCraftUI:
public class ItemCraftUI : MonoBehaviour
{
[SerializeField] private Text itemNametext;
public void Init(string itemName)
{
itemNametext.text = itemName;
}
}