Im trying to make a transport game.Cities are scriptable objects with their names populations and incomes that i will display with a city/button depending on what city it is. I dont really have an idea on how to do this but here is what i have done so far :
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class GameManager : MonoBehaviour
{
[Header("CityButtons")]
[SerializeField] private Button ThessalonikiButton;
[SerializeField] private Button AlexandroupolisButton;
[SerializeField] private Button KozaniButton;
[SerializeField] private Button LarissaButton;
[SerializeField] private Button IoanninaButton;
[SerializeField] private Button CorfuButton;
[SerializeField] private Button PatraButton;
[Header("ScriptableObjects")]
[SerializeField] private ScriptableCitiesScript thessalonikiSO;
[SerializeField] private ScriptableCitiesScript alexandroupolisSO;
[SerializeField] private ScriptableCitiesScript kozaniSO;
[SerializeField] private ScriptableCitiesScript larissaSO;
[SerializeField] private ScriptableCitiesScript ioanninaSO;
[SerializeField] private ScriptableCitiesScript corfuSO;
[SerializeField] private ScriptableCitiesScript patraSO;
[Header("Texts")]
//City info Texts
[SerializeField] private TextMeshProUGUI CityName;
[SerializeField] private TextMeshProUGUI CityPopulation;
[SerializeField] private TextMeshProUGUI CityAverageIncome;
[SerializeField] private TextMeshProUGUI CityTransportationMethods;
//Texts
[SerializeField] private TextMeshProUGUI moneyText;
[SerializeField] private TextMeshProUGUI passengersTransportedText;
[Header("GameObjects")]
[SerializeField] private GameObject CityInfo;
[Header("Floats")]
[SerializeField] private float Money;
[SerializeField] private float passengersTransported;
private void Awake()
{
CityInfo.SetActive(false);
}
private void Update()
{
ChangeMoneyAndTransportedPassengers();
CloseCityInfo();
OnClickedButtons();
}
private void ChangeMoneyAndTransportedPassengers()
{
moneyText.text = "Money : " + Money.ToString("N0");
passengersTransportedText.text = "Passengers transported : " + passengersTransported.ToString("N0");
}
private void CloseCityInfo()
{
if (Input.GetMouseButtonDown(1))
{
CityInfo.SetActive(false);
}
}
private void OnClickedButtons()
{
ThessalonikiButton.onClick.AddListener(ThessalonikiCityInfo);
AlexandroupolisButton.onClick.AddListener(AlexandroupolisCityInfo);
LarissaButton.onClick.AddListener(LarissaCityInfo);
KozaniButton.onClick.AddListener(KozaniCityInfo);
IoanninaButton.onClick.AddListener(LarissaCityInfo);
CorfuButton.onClick.AddListener(KozaniCityInfo);
PatraButton.onClick.AddListener(LarissaCityInfo);
}
private void ThessalonikiCityInfo()
{
//Set city info tab active
CityInfo.SetActive(true);
//Set city's info texts
CityName.text = thessalonikiSO.Name;
CityPopulation.text = "Population : " + thessalonikiSO.population.ToString("N0");
CityAverageIncome.text = "Average income : " + thessalonikiSO.averageIncome.ToString("N0");
}
private void AlexandroupolisCityInfo()
{
//Set city info tab active
CityInfo.SetActive(true);
//Set city's info texts
CityName.text = alexandroupolisSO.Name;
CityPopulation.text = "Population : " + alexandroupolisSO.population.ToString("N0");
CityAverageIncome.text = "Average income : " + alexandroupolisSO.averageIncome.ToString("N0");
}
private void LarissaCityInfo()
{
//Set city info tab active
CityInfo.SetActive(true);
//Set city's info texts
CityName.text = larissaSO.Name;
CityPopulation.text = "Population : " + larissaSO.population.ToString("N0");
CityAverageIncome.text = "Average income : " + larissaSO.averageIncome.ToString("N0");
}
private void KozaniCityInfo()
{
//Set city info tab active
CityInfo.SetActive(true);
//Set city's info texts
CityName.text = kozaniSO.Name;
CityPopulation.text = "Population : " + kozaniSO.population.ToString("N0");
CityAverageIncome.text = "Average income : " + kozaniSO.averageIncome.ToString("N0");
}
}
i noticed this is pretty time consuming by having to write a button a scriptable object and a method that displays that so im wondering if anyone knows an easier method to do that.
also here is the scriptable object script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "ScriptableCities", menuName = "ScriptableObjects/ScriptableCities")]
public class ScriptableCitiesScript : ScriptableObject
{
public string Name;
public float population;
public float averageIncome;
public bool busTransport;
public bool trainTransport;
public bool boatTransport;
public bool planeTransport;
}