내일배움캠프 43일차 TIL <Unity UIManager> 06/10

정광훈(Unity_9기)·2025년 6월 10일

TIL (Today I Learned)

목록 보기
53/110
post-thumbnail

UIManager는 어떻게 돌아가는 것인가

UI와 관련된 코드 부분만 가져옴


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    private UIManager uiManager;
    
    public PlayerController player { get; private set; }
    private ResourceController _playerResourceController;
    
    private void Awake()
    {
        Instance = this;

        uiManager = FindObjectOfType<UIManager>();

 		_playerResourceController = player.GetComponent<ResourceController>();
        _playerResourceController.RemoveHealthChangeEvent(uiManager.ChangePlayerHP);
        _playerResourceController.AddHealthChangeEvent(uiManager.ChangePlayerHP);
    }

    public void StartGame()
    {
        uiManager.SetPlayGame(); // 게임 UI로 전환
    }

    void StartNextWave()
    {
        uiManager.ChangeWave(currentWaveIndex); // 웨이브 텍스트 업데이트
    }

    public void GameOver()
    {
        uiManager.SetGameOver(); // 게임오버 UI로 전환
    }


    public void StartStage()
    {
        uiManager.ChangeWave(currentStageIndex + 1);
    }
}

using UnityEngine;

public enum UIState
{
    Home,
    Game,
    GameOver,
}

public class UIManager : MonoBehaviour
{   
    HomeUI homeUI;
    GameUI gameUI;
    GameOverUI gameOverUI;
    
    private UIState currentState; // 현재 UI 상태 - enum UIState의 값을 가지고 있음

    
    private void Awake()
    {
        // 자식 오브젝트에서 각각의 UI를 찾아 초기화
        homeUI = GetComponentInChildren<HomeUI>(true);
        homeUI.Init(this);
        gameUI = GetComponentInChildren<GameUI>(true);
        gameUI.Init(this);
        gameOverUI = GetComponentInChildren<GameOverUI>(true);
        gameOverUI.Init(this);
        
        // 초기 상태를 홈 화면으로 설정
        ChangeState(UIState.Home);
    }

    public void SetPlayGame() // 게임매니저 스크립트에서 사용
    {
        ChangeState(UIState.Game); // 게임UI로 전환
    }
    
    public void SetGameOver() // 게임매니저 스크립트에서 사용
    {
        ChangeState(UIState.GameOver); // 게임오버UI로 전환
    }

    public void ChangeWave(int waveIndex) // 게임매니저 스크립트에서 사용
    {
        gameUI.UpdateWaveText(waveIndex);
    }

    public void ChangePlayerHP(float currentHP, float maxHP)
    {
        gameUI.UpdateHPSlider(currentHP/ maxHP);
    }
    
    public void ChangeState(UIState state) // 현재 UI상태
    {
        currentState = state; // 매개변수값을 현재 UI상태로 저장
        homeUI.SetActive(currentState); // SetActive() 메서드 호출한거임
        gameUI.SetActive(currentState);
        gameOverUI.SetActive(currentState);
    }
}

using UnityEngine;

public abstract class BaseUI : MonoBehaviour
{
    protected UIManager uiManager;

    public virtual void Init(UIManager uiManager) // 초기 UI - HomeUI 스크립트에서 사용
    {
        this.uiManager = uiManager;
    }
    
    protected abstract UIState GetUIState();  // UI상태 가져오기
    
    public void SetActive(UIState state) // UI활성화
    {
        // 다른 UI스크립트에서 GetUIState에서 반환한 값과 매개변수 state가 같다면 활성화 
        this.gameObject.SetActive(GetUIState() == state);
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class HomeUI : BaseUI
{
    [SerializeField] private Button startButton;
    [SerializeField] private Button exitButton;

    public override void Init(UIManager uiManager)
    {
        base.Init(uiManager);
        startButton.onClick.AddListener(OnClickStartButton);
        exitButton.onClick.AddListener(OnClickExitButton);
    }
    
    public void OnClickStartButton()
    {
        GameManager.Instance.StartGame();
    }

    public void OnClickExitButton()
    {
        Application.Quit();
    }
    
    protected override UIState GetUIState() // UI상태 가져오기
    {
        return UIState.Home; // 현재 UI 상태를 Home으로 반환
    }
}

using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class GameUI : BaseUI
{
    [SerializeField] public TextMeshProUGUI waveText;
    [SerializeField] public Slider hpSlider;

    private void Start()
    {
        UpdateHPSlider(1);
    }

    public void UpdateHPSlider(float percentage)
    {
        hpSlider.value = percentage;
    }

    public void UpdateWaveText(int wave)
    {
        waveText.text = wave.ToString();
    }

    protected override UIState GetUIState() // UI상태 가져오기
    {
        return UIState.Game; // 현재 UI 상태를 Game으로 반환
    }
}

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class GameOverUI : BaseUI
{
    [SerializeField] private Button restartButton;
    [SerializeField] private Button exitButton;

    public override void Init(UIManager uiManager)
    {
        base.Init(uiManager);
        restartButton.onClick.AddListener(OnClickRestartButton);
        exitButton.onClick.AddListener(OnClickExitButton);
    }
    
    public void OnClickRestartButton()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

    public void OnClickExitButton()
    {
        Application.Quit();
    }

    protected override UIState GetUIState() // UI상태 가져오기
    {
        return UIState.GameOver; // 현재 UI 상태를 GameOver으로 반환
    }
}

저번 프로젝트에서 적용할 수 있는 부분이면 적용해볼 예정

0개의 댓글