public class Constants
{
public enum GameType { SinglePlay, DualPlay, MultiPlay }
}
싱글, 듀얼, 멀티 플레이를 추후에 지원하기 위해서 enum 타입으로 게임 모드를 정의해 주었다.
2. 전역 게임 매니저
using UnityEngine;
using UnityEngine.SceneManagement;
public abstract class Singleton<T> : MonoBehaviour where T : Component
{
private static T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
_instance = FindFirstObjectByType<T>();
if (_instance == null)
{
GameObject obj = new GameObject();
obj.name = typeof(T).Name;
_instance = obj.AddComponent<T>();
}
}
return _instance;
}
}
public void Awake()
{
if (_instance == null)
{
_instance = this as T;
DontDestroyOnLoad(gameObject);
// 씬 전환시 호출되는 액션 메서드 할당
SceneManager.sceneLoaded += OnSceneLoad;
}
else
{
Destroy(gameObject);
}
}
protected abstract void OnSceneLoad(Scene scene, LoadSceneMode mode);
}
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class GameManager : Singleton<GameManager>
{
[SerializeField] private GameObject confirmPanel;
private Constants.GameType _gameType; // Main 씬에서 선택한 게임 타입
private Canvas _canvas;
public void ChangeToGameScene(Constants.GameType gameType)
{
_gameType = gameType;
SceneManager.LoadScene("Game");
}
public void ChangeToMainScene()
{
SceneManager.LoadScene("Main");
}
public void OpenConfirmPanel(string message)
{
if (_canvas != null)
{
var confirmPanelObject = Instantiate(confirmPanel, _canvas.transform);
confirmPanelObject.GetComponent<ConfirmPanelController>().Show(message);
}
}
protected override void OnSceneLoad(Scene scene, LoadSceneMode mode)
{
_canvas = FindFirstObjectByType<Canvas>();
}
}
씬 전환과 팝업 호출을 총괄하는 GameManager를 만들어 주었다.
메인 ↔ 게임 씬 전환
선택된 GameType 저장
팝업 패널 띄우기
이때 싱글톤 패턴을 적용해야 하므로 별도의 베이스 클래스를 만들어 주었다.
씬이 바뀌어도 파괴되지 않고 하나만 존재
3. 메인 패널 버튼 연결
using UnityEngine;
using UnityEngine.UI;
public class MainPanelController : MonoBehaviour
{
public void OnClickSinglePlayButton()
{
GameManager.Instance.ChangeToGameScene(Constants.GameType.SinglePlay);
}
public void OnClickMultiPlayButton()
{
GameManager.Instance.ChangeToGameScene(Constants.GameType.MultiPlay);
}
public void OnClickDualPlayButton()
{
GameManager.Instance.ChangeToGameScene(Constants.GameType.DualPlay);
}
public void OnClickSettingsButton()
{
}
}
메인 씬에 배치된 싱글/듀얼/멀티/환경설정 버튼을 각각 해당 스크립트에서 처리해 주었다.
버튼 클릭 시 → GameManager.Instance.ChangeToGameScene() 호출
인자로 Constants.GameType 전달
즉, 플레이어가 어떤 버튼을 눌렀는지에 따라 게임 모드가 결정된다.
4. 게임 씬 구성
using UnityEngine;
public class GameUIController : MonoBehaviour
{
public void OnClickBackButton()
{
// GameManager.Instance.ChangeToMainScene();
GameManager.Instance.OpenConfirmPanel("게임을 종료하시겠습니까?");
}
}
게임 씬으로 넘어왔을 때 뒤로가기 버튼을 누르면 곧바로 메인 씬으로 돌아가는 게 아니라 확인 팝업을 띄우도록 한다.
뒤로가기 버튼 클릭 시 → GameManager.Instance.OpenConfirmPanel("게임을 종료하시겠습니까?"); 호출
5. 팝업 패널 구현
using TMPro;
using UnityEngine;
public class ConfirmPanelController : PanelController
{
[SerializeField] private TMP_Text messageText;
public void Show(string message)
{
messageText.text = message;
base.Show();
}
public void OnClickConfirmButton()
{
Hide();
}
public void OnClickCloseButton()
{
Hide();
}
}