
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으로 반환
}
}
저번 프로젝트에서 적용할 수 있는 부분이면 적용해볼 예정