UI를 관리하는 UiManager, TextManager, ButtonManager를 생성.

Prefab에 대한 이해

//UiManager
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using System;
using System.Collections.Generic;
using UnityEditor.Rendering;
using Unity.VisualScripting;
using System.Linq;

public class UiManager : MonoBehaviour
{
    [SerializeField] private GameManager gameManager;
    [SerializeField] private TextManager textManager;
    [SerializeField] private ButtonManager buttonManager;

    [SerializeField] private GameObject upgradeScrollPanel;
    [SerializeField] private GameObject stockScrollPanel;
    [SerializeField] private GameObject hirePanel;
    [SerializeField] private GameObject infoPanel;
    [SerializeField] private GameObject storePanel;

    [SerializeField] private GameObject gachaPanel;

    [SerializeField] private GameObject teamBuildingPanel;
    [SerializeField] private GameObject teamPanel;
    [SerializeField] private GameObject teamInfoPanel;
    [SerializeField] private GameObject employeeScrollPanel;

    [SerializeField] private GameObject hpBar;

    void Awake()
    {
        OffMenuPanel();
        SetGachaPanel();
        OffGachaPanel();
        SetTeamBuildingPanel();
        SetUpgradeScrollPanel();
        SetStockScrollPanel();
        SetHpBar();
    }

    public void OffMenuPanel()
    {
        upgradeScrollPanel.SetActive(false);
        stockScrollPanel.SetActive(false);
        hirePanel.SetActive(false);
        infoPanel.SetActive(false);
        storePanel.SetActive(false);
        teamBuildingPanel.SetActive(false);
        OffEmployeeScrollPanel();
        OffTeamInfoPanel();
    }

    public void SetMenuPanel(GameObject obj)
    {
        if (obj.activeSelf == true) OffMenuPanel();
        else
        {
            OffMenuPanel();
            obj.SetActive(true);
            if (obj == teamBuildingPanel) SetTeamInfo(1);
            // if (obj == employeeScrollPanel) gameManager.ShowEmploy(employeeScrollPanel.GetComponent<ScrollRect>().content);
            if (obj == stockScrollPanel) gameManager.ShowStock(stockScrollPanel.GetComponent<ScrollRect>().content);
        }
    }

    public void SetTeamInfo(int jobType)
    {
        gameManager.ShowEmploy(employeeScrollPanel.GetComponent<ScrollRect>().content, jobType, true);
        // gameManager.ShowEmploy(teamInfoPanel.GetComponent<GridLayoutGroup>().transform, jobType, false);
    }

    public List<Employee> GetSeclectedEmployee()
    {
        List<Employee> selectedEmployees = new List<Employee>();
        foreach (Transform child in employeeScrollPanel.GetComponent<ScrollRect>().content)
        {
            Employee employee = child.GetComponent<Employee>();
        }
        return selectedEmployees;
    }

    private void SetGachaPanel()
    {
        RectTransform rt = gachaPanel.GetComponent<RectTransform>();
        GridLayoutGroup grid = gachaPanel.GetComponent<GridLayoutGroup>();
        float side = Math.Min(rt.rect.width / 3 - 3, rt.rect.height / 2 - 3);
        grid.cellSize = new Vector2(side, side);
    }
    public GameObject GetGachaPanel()
    {
        return gachaPanel;
    }

    public void OnGachaPanel()
    {
        gachaPanel.SetActive(true);
    }

    public void OffGachaPanel()
    {
        foreach (Transform child in gachaPanel.GetComponent<Transform>())
        {
            Destroy(child.gameObject);
        }

        gachaPanel.SetActive(false);
    }

    private void SetTeamBuildingPanel()
    {
        RectTransform content = employeeScrollPanel.GetComponent<ScrollRect>().content;
        GridLayoutGroup grid = content.GetComponent<GridLayoutGroup>();
        float side = content.rect.width / 4;
        grid.cellSize = new Vector2(side, side);
    }
    private void SetUpgradeScrollPanel()
    {
        RectTransform content = upgradeScrollPanel.GetComponent<ScrollRect>().content;
        GridLayoutGroup grid = content.GetComponent<GridLayoutGroup>();
        float side = content.rect.height / 4;
        grid.cellSize = new Vector2(content.rect.width, side);
    }
    private void SetStockScrollPanel()
    {
        RectTransform content = stockScrollPanel.GetComponent<ScrollRect>().content;
        GridLayoutGroup grid = content.GetComponent<GridLayoutGroup>();
        float side = content.rect.height / 4;
        grid.cellSize = new Vector2(content.rect.width, side);
    }

    public void OnEmployeeScrollPanel()
    {

    }

    public void OffEmployeeScrollPanel()
    {
        foreach (Transform child in employeeScrollPanel.GetComponent<ScrollRect>().content)
        {
            Destroy(child.gameObject);
        }
        // employeeScrollPanel.SetActive(false);
    }
    public void OffStockScrollPanel()
    {
        foreach (Transform child in stockScrollPanel.GetComponent<ScrollRect>().content)
        {
            Destroy(child.gameObject);
        }
        employeeScrollPanel.SetActive(false);
    }
    //이거 왜 참조 0개임

    public void RefreshStockPanel()
    {
        foreach (Transform child in stockScrollPanel.GetComponent<ScrollRect>().content)
            Destroy(child.gameObject);

        gameManager.ShowStock(stockScrollPanel.GetComponent<ScrollRect>().content);
    }

    public void OffTeamInfoPanel()
    {
        foreach (Transform child in teamInfoPanel.GetComponent<GridLayoutGroup>().transform)
        {
            Destroy(child.gameObject);
        }
        // employeeScrollPanel.SetActive(false);
    }

    public void SetHpBar()
    {
        GameObject currentHpBar = hpBar.transform.Find("Current").gameObject;
        // Debug.Log(currentHpBar.GetComponent<Image>());
        currentHpBar.GetComponent<Image>().fillAmount = gameManager.GetPlayer().GetCurHp() / (float)gameManager.GetPlayer().GetMaxHp();
        // Debug.Log("Fill Amount : " + gameManager.GetPlayer().GetCurHp() / (float)gameManager.GetPlayer().GetMaxHp());
        textManager.SetHpInfoText(gameManager.GetPlayer().GetCurHp(), gameManager.GetPlayer().GetMaxHp(), gameManager.GetPlayer().GetRecoverHpPersecond());
    }
}

//TextManager
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using Unity.Android.Gradle.Manifest;
using UnityEditor.Rendering.LookDev;
using System;

public class TextManager : MonoBehaviour
{
    [SerializeField] private GameManager gameManager;
    [SerializeField] private UiManager uiManager;
    [SerializeField] private ButtonManager buttonManager;
    [SerializeField] private TextMeshProUGUI wonText;
    [SerializeField] private TextMeshProUGUI wonPerClickText;
    [SerializeField] private TextMeshProUGUI dollarText;
    [SerializeField] private TextMeshProUGUI dollarPerMonthText;
    [SerializeField] private TextMeshProUGUI dateText;
    [SerializeField] private TextMeshProUGUI hpInfoText;

    void Start()
    {
        SetWonText();
        SetDollarText();
        SetWonPerClickText();
        SetDollarPerMonthText();
        SetDateText();
    }
    void Update()
    {
        SetDateText();
    }

    public void SetWonText()
    {
        wonText.text = "\\\\: " + gameManager.GetWon().ToString();
    }
    public void SetDollarText()
    {
        dollarText.text = "$: " + gameManager.GetDollar().ToString();
    }
    public void SetWonPerClickText()
    {
        wonPerClickText.text = gameManager.GetPlayer().GetWonPerClick().ToString() + "\\\\/Click";
    }
    public void SetDollarPerMonthText()
    {
        dollarPerMonthText.text = gameManager.GetDollarPerMonth().ToString() + "\\\\/Month";
    }
    public void SetDateText()
    {
        dateText.text = gameManager.GetDate().GetDate() + " " + gameManager.GetDate().GetTime();
    }

    public void SetClickLevelUpButton(Button button)
    {
        Text costText = button.transform.Find("Cost").GetComponent<Text>();
        TextMeshProUGUI infoText = button.transform.Find("InfoText").GetComponent<TextMeshProUGUI>();

        if (gameManager.GetPlayer().GetClickLevel() == DataBase.MAX_LEVEL) {
            costText.text = "MAX";
            infoText.text = "Click Level Up\\nLV : MAX";
        }
        else {
            costText.text = DataBase.clickLevelUpCost[gameManager.GetPlayer().GetClickLevel()].ToString();
            infoText.text = "Click Level Up\\nLV : " + gameManager.GetPlayer().GetClickLevel().ToString();
        }
    }

    public void SetHpLevelUpButton(Button button)
    {
        Text costText = button.transform.Find("Cost").GetComponent<Text>();
        TextMeshProUGUI infoText = button.transform.Find("InfoText").GetComponent<TextMeshProUGUI>();

        if (gameManager.GetPlayer().GetHpLevel() == DataBase.MAX_LEVEL)
        {
            costText.text = "MAX";
            infoText.text = "Hp Level Up\\nLV : MAX";
        }
        else
        {
            costText.text = DataBase.hpLevelUpCost[gameManager.GetPlayer().GetHpLevel()].ToString();
            infoText.text = "Hp Level Up\\nLV : " + gameManager.GetPlayer().GetHpLevel().ToString();
        }
    }

    public void SetMaxEmployeeLevelUpButton(Button button, String typeName)
    {
        Text costText = button.transform.Find("Cost").GetComponent<Text>();
        TextMeshProUGUI infoText = button.transform.Find("InfoText").GetComponent<TextMeshProUGUI>();

        if (gameManager.GetEmployeeValue().GetLevel() == DataBase.MAX_EMPLOYEE_LEVEL)
        {
            costText.text = "MAX";
            infoText.text = "Max Employee Level Up\\nLV : MAX";
        }
        else
        {
            costText.text = DataBase.valueCost[typeName][gameManager.GetEmployeeValue().GetLevel()].ToString();
            infoText.text = "Max Employee Level Up\\nLV : " + gameManager.GetEmployeeValue().GetLevel().ToString();
        }
        SetWonText();
    }
    public void SetMaxTeamLevelUpButton(Button button, String typeName)
    {
        Text costText = button.transform.Find("Cost").GetComponent<Text>();
        TextMeshProUGUI infoText = button.transform.Find("InfoText").GetComponent<TextMeshProUGUI>();

        if (gameManager.GetTeamValue().GetLevel() == DataBase.MAX_TEAM_LEVEL)
        {
            costText.text = "MAX";
            infoText.text = "Max Team Level Up\\nLV : MAX";
        }
        else
        {
            costText.text = DataBase.valueCost[typeName][gameManager.GetTeamValue().GetLevel()].ToString();
            infoText.text = "Max Team Level Up\\nLV : " + gameManager.GetTeamValue().GetLevel().ToString();
        }
        SetWonText();
    }
    public void SetMaxAppLevelUpButton(Button button, String typeName)
    {
        Text costText = button.transform.Find("Cost").GetComponent<Text>();
        TextMeshProUGUI infoText = button.transform.Find("InfoText").GetComponent<TextMeshProUGUI>();

        if (gameManager.GetAppValue().GetLevel() == DataBase.MAX_APP_LEVEL)
        {
            costText.text = "MAX";
            infoText.text = "Max App Level Up\\nLV : MAX";
        }
        else
        {
            costText.text = DataBase.valueCost[typeName][gameManager.GetAppValue().GetLevel()].ToString();
            infoText.text = "Max App Level Up\\nLV : " + gameManager.GetAppValue().GetLevel().ToString();
        }
        SetWonText();
    }

    public void SetGachaInfoText(GameObject obj, Employee employee)
    {
        TextMeshProUGUI nameText = obj.transform.Find("NameText").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI rankText = obj.transform.Find("RankText").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI wagesText = obj.transform.Find("WagesText").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI statText = obj.transform.Find("StatText").GetComponent<TextMeshProUGUI>();

        nameText.text = employee.GetName();
        rankText.text = employee.GetRankType().ToString();
        wagesText.text = "Wage\\n" + employee.GetWage().ToString();
        statText.text = "Stat\\n" + employee.GetStat().ToString();
    }

    public void SetEmployeeChooseText(GameObject obj, Employee employee)
    {
        TextMeshProUGUI nameText = obj.transform.Find("NameText").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI rankText = obj.transform.Find("RankText").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI wagesText = obj.transform.Find("WagesText").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI statText = obj.transform.Find("StatText").GetComponent<TextMeshProUGUI>();

        nameText.text = employee.GetName();
        rankText.text = employee.GetRankType().ToString();
        wagesText.text = "Wage\\n" + employee.GetWage().ToString();
        statText.text = "Stat\\n" + employee.GetStat().ToString();
    }

    public void SetHpInfoText(int curHp, int maxHp, int recoverHpPerSecond)
    {
        hpInfoText.text = curHp.ToString() + "/" + maxHp.ToString() + "  " + recoverHpPerSecond.ToString() + "/s";
    }
    
    public void SetStockText(GameObject obj, Stock stock)
    {
        TextMeshProUGUI StockNameText = obj.transform.Find("StockNameText").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI StockCost = obj.transform.Find("StockCost").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI StockChangeRate = obj.transform.Find("StockChangeRate").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI StockHavingCount = obj.transform.Find("StockHavingCount").GetComponent<TextMeshProUGUI>();

        StockNameText.text = stock.GetStockName();
        StockCost.text = "\\\\" + stock.GetStockCost().ToString();
        if (stock.GetStockChangeRate() > 0.0)
        {
            StockChangeRate.text = "+" + stock.GetStockChangeRate().ToString("F1") + "%";
            StockChangeRate.color = Color.red;
        }
        else if (stock.GetStockChangeRate() == 0.0)
        {
            StockChangeRate.text = stock.GetStockChangeRate().ToString("F1") + "%";
            StockChangeRate.color = Color.black;
        }
        else
        {
            StockChangeRate.text = stock.GetStockChangeRate().ToString("F1") + "%";
            StockChangeRate.color = Color.blue;
        }
        StockHavingCount.text = stock.GetStockHavingCount().ToString() + "주";
    }
}
//ButtonMananger
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using Unity.Android.Gradle.Manifest;

public class ButtonManager : MonoBehaviour
{
    [SerializeField] private GameManager gameManager;
    [SerializeField] private UiManager uiManager;
    [SerializeField] private TextManager textManager;

    [SerializeField] private Button ClickLevelUpButton;
    [SerializeField] private Button HpLevelUpButton;
    [SerializeField] private Button MaxEmployeeLevelUpButton;
    [SerializeField] private Button MaxTeamLevelUpButton;
    [SerializeField] private Button MaxAppLevelUpButton;

    [SerializeField] private Button DeveloperHireButton;
    [SerializeField] private Button DesignerHireButton;
    [SerializeField] private Button PlannerHireButton;
    [SerializeField] private Button ExpertHireButton;

    [SerializeField] private Button TeamBuildingButton;

    void Awake()
    {
        textManager.SetClickLevelUpButton(ClickLevelUpButton);
        textManager.SetHpLevelUpButton(HpLevelUpButton);
        textManager.SetMaxEmployeeLevelUpButton(MaxEmployeeLevelUpButton, "Employee");
        textManager.SetMaxTeamLevelUpButton(MaxTeamLevelUpButton, "Team");
        textManager.SetMaxAppLevelUpButton(MaxAppLevelUpButton, "App");
    }

    public void BackGroundButtonClicked()
    {
        Debug.Log("AddWonButton Clicked");
        gameManager.GetPlayer().Clicked();
    }
    public void ClickLevelUpButtonClicked(GameObject button)
    {
        Debug.Log("WonPerClickLevelUpButton Clicked");
        gameManager.GetPlayer().ClickLevelUp();
        textManager.SetClickLevelUpButton(ClickLevelUpButton);
    }

    public void HpLevelUpButtonClicked(GameObject button)
    {
        Debug.Log("HpLevelUpButton Clicked");
        gameManager.GetPlayer().HpLevelUp();
        textManager.SetHpLevelUpButton(HpLevelUpButton);
    }

    public void MaxEmployeeLevelUpButtonClicked(GameObject button)
    {
        Debug.Log("MaxEmployeeLevelUpButton Clicked");
        gameManager.GetEmployeeValue().LevelUp(DataBase.MAX_EMPLOYEE_LEVEL, "Employee");
        textManager.SetMaxEmployeeLevelUpButton(MaxEmployeeLevelUpButton, "Employee");
    }
    public void MaxTeamLevelUpButtonClicked(GameObject button)
    {
        Debug.Log("MaxTeamLevelUpButton Clicked");
        gameManager.GetTeamValue().LevelUp(DataBase.MAX_TEAM_LEVEL, "Team");
        textManager.SetMaxEmployeeLevelUpButton(MaxTeamLevelUpButton, "Team");
    }
    public void MaxAppLevelUpButtonClicked(GameObject button)
    {
        Debug.Log("MaxAppLevelUpButton Clicked");
        gameManager.GetAppValue().LevelUp(DataBase.MAX_APP_LEVEL, "App");
        textManager.SetMaxAppLevelUpButton(MaxAppLevelUpButton, "App");
    }

    public void MainPanelButtonClicked(GameObject obj)
    {
        uiManager.SetMenuPanel(obj);
    }

    public void GachaButtonClicked(int job)
    {
        gameManager.EmployeeGacha(job);
    }
    private void GachaChooseButtonClicked(Employee employee)
    {
        gameManager.AddEmployee(employee);
        gameManager.GetGacha().ToggleIsGacha();
        uiManager.OffGachaPanel();
    }
    public void SetGachaInfoButton(GameObject obj, Employee employee)
    {
        Button btn = obj.transform.Find("ChooseButton").GetComponent<Button>();
        btn.onClick.AddListener(() => GachaChooseButtonClicked(employee));
    }

    public void SetEmployeeChooseToggle(GameObject obj, Employee employee)
    {
        Toggle toggle = obj.GetComponent<Toggle>();
        if (toggle == null) Debug.Log("Null Toggle Object");
        toggle.onValueChanged.AddListener(EmployeeChooseToggleClicked);
    }
    public void SetStockButton(GameObject obj, Stock stock)
    {
        Button buybtn = obj.transform.Find("BuyButton").GetComponent<Button>();
        Button sellbtn = obj.transform.Find("SellButton").GetComponent<Button>();

        buybtn.onClick.AddListener(() => StockBuyButtonClicked(obj, stock));
        sellbtn.onClick.AddListener(() => StockSellButtonClicked(obj, stock));
    }

    public void JobTypeButtonClicked(int jobType)
    {
        uiManager.OffEmployeeScrollPanel();
        uiManager.OffTeamInfoPanel();
        uiManager.SetTeamInfo(jobType);
    }

    private void EmployeeChooseToggleClicked(bool isOn)
    {

    }

    private void StockBuyButtonClicked(GameObject obj, Stock stock)
    {
        if (gameManager.SubWon(stock.GetStockCost() + stock.GetStockCost()/1000))
        {
            stock.Add();
            textManager.SetStockText(obj, stock);
        }
        //Debug.Log(stock.GetStockName());
    }
    private void StockSellButtonClicked(GameObject obj, Stock stock)
    {
        //Debug.Log(stock.GetStockName());
        if (stock.Sub()) gameManager.AddWon(stock.GetStockCost() - stock.GetStockCost()/1000);
        textManager.SetStockText(obj, stock);
        //수수료 0.1%
    }
}