How to make cleaner easier to use and faster code?

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;
}

First of all, to answer your question:
You can do these two things to massively simplify this code.

  1. use an array of ScriptableCitiesScript
  2. spawn buttons dynamically
// all of your cities in one line!
[SerializeField] private ScriptableCitiesScript[] cities;

// a prefab containing a Button component that will be spawned for each city
[SerializeField] private Button cityButtonPrefab;

// a Transform/RectTransform that will be a parent for all your buttons 
[SerializeField] private Transform buttonsParent;

private void Awake()
{
   SpawnButtons();
}

private void  SpawnButtons()
{
    foreach(var city in cities)
    {
        var button = Instantiate(cityButtonPrefab, buttonsParent);
        var text = button.GetComponentInChildren<Text>();
        text.text = city.Name;

        // an anonymous function
        button.onClick.AddListener(() => 
        {
            ShowCityInfo(city); 
        });
    }
}

private void ShowCityInfo(ScriptableCitiesScript city)
{
    //Set city info tab active
    CityInfo.SetActive(true);

    //Set city's info texts
    CityName.text = city.Name;
    CityPopulation.text = "Population : " + city.population.ToString("N0");
    CityAverageIncome.text = "Average income : " + city.averageIncome.ToString("N0");
}

To be fair with you, that’s not the most elegant solution but my guess is that you’re not creating any production-ready code so that should be sufficient for now.

PS. I wrote this code in the answer field, not in an IDE, so you can expect some typos to be there