이번엔 게임이 끝이 나고, Main 버튼을 눌렀을 때, 메인화면으로 이동하는 기능을 만들 것이다.
씬을 다시 불러오는 방식을 사용해도 되지만, 앞서 만들었던 Retry에서 사용한 함수들을 활용해서 만들 것이다.

GameManager
public void MainScene()
{
reGame?.Invoke();
gameInit?.Invoke();
myState = GameState.STANDBY;
winner = Winner.NONE;
mainScene?.Invoke();
Time.timeScale = 1f;
}
가장 먼저 GameManager에서 Main 버튼을 눌렀을 때, 실행될 함수를 만들어 준다.
Retry 함수와 같이 reGame과 gameInit 함수를 호출해 준다. 이로써 모든 큐브가 제거되고, 처음 메인화면과 같이 코어 두개만 나오게 된다.
main Scene을 통해서 Retry 이벤트에 추가로 기능을 넣어서 만들어 준다.
CameraMovement
void Start()
{
GameManager.Instance.enemySelete += enemySeleteCam;
GameManager.Instance.gameStart += gameStartCam;
// GameManager.Instance.gameStart += ChangeCamera;
GameManager.Instance.mainScene += ChangeMain;
}
public void ChangeCamera(CinemachineCamera myCam)
{
Debug.Log(myCam);
foreach(var cam in cams)
{
cam.Priority = 0;
}
myCam.Priority = 10;
controllCam = myCam;
// playingCam.Priority += 10;
// controllCam = playingCam;
}
private void OnDisable()
{
GameManager.Instance.enemySelete -= enemySeleteCam;
GameManager.Instance.gameStart -= gameStartCam;
// GameManager.Instance.gameStart -= ChangeCamera;
GameManager.Instance.mainScene -= ChangeMain;
}
void ChangeMain() // 카메라를 메인카메라로 전환한다.
{
Debug.Log("메인 카메라로 변경");
ChangeCamera(standbyCam);
}
ChangeMain 함수를 통해 카메라가 메인카메라로 전환되도록 한다.
카메라 전환또한 시간 기반으로 움직이기 때문에 Time.timeScale이 1이 되야 움직일 수 있다.

UIManager
[SerializeField] GameObject startButton;
void Start()
{
GameManager.Instance.enemySelete += enemyLevel;
GameManager.Instance.gameStart += playStart;
GameManager.Instance.gameFinish += FinishUI;
GameManager.Instance.reGame += ReStartUI;
GameManager.Instance.mainScene += MainUI;
}
private void OnDisable()
{
GameManager.Instance.enemySelete -= enemyLevel;
GameManager.Instance.gameStart -= playStart;
GameManager.Instance.gameFinish -= FinishUI;
GameManager.Instance.reGame -= ReStartUI;
GameManager.Instance.mainScene -= MainUI;
}
void enemyLevel() // 적 난이도 UI
{
startButton.SetActive(false);
enemyLevels.SetActive(true);
nextButton.SetActive(true);
}
// public void DeleteMe(GameObject myObject)
// {
// Destroy(myObject);
// }
void ReStartUI()
{
finishPanel.SetActive(false);
retryButton.SetActive(false);
enemyWin_t.SetActive(false);
playerWin_t.SetActive(false);
}
void MainUI()
{
ReStartUI();
startButton.SetActive(true);
resourceValue_T.gameObject.SetActive(false);
}
}
UIManager에서는 Main화면으로 돌아왔을때, Start버튼이 보이도록 한다.
원래 Start Button 의 경우 선택시 DeleteMe라는 함수를 통해 삭제되었는데 삭제하지 않고 startButton 변수로 받아서 비/활성화 하는 방식으로 사용한다.
자원량 텍스트의 경우에도 MainUI의 경우 비활성화 해준다.
EnemyAI
protected override void Start()
{
base.Start();
GameManager.Instance.gameStart += LevelSetUp;
GameManager.Instance.gameStart += StartMyCoroutine;
GameManager.Instance.gameInit += StartMyCoroutine;
GameManager.Instance.reGame += StopThink;
}
void StartMyCoroutine()
{
Debug.Log("AI 실행");
myCoroutine = StartCoroutine(ThinkBehaviour());
}
void StopThink()
{
StopCoroutine(myCoroutine);
}
protected override void OnDisable()
{
base.OnDisable();
GameManager.Instance.gameStart -= LevelSetUp;
GameManager.Instance.gameStart -= StartMyCoroutine;
GameManager.Instance.reGame -= StopThink;
}
EnemyAI의 경우 Main 이나 Retry의 경우 ThickBehaviour가 계속 유지되면서 실행되기 때문에 myCoroutine이라는 Coroutine을 만들고, 게임이 재시작 될때, StopCoroutine으로 코루틴을 멈춘다. 이후 다시 게임이 재게되면 행동할 수 있도록 변경해준다.
재시작 할때에 다시 Coroutine을 실행시키기 위해 gameInit에 StartMyCoroutine을 실행해준다.
완성본

'GameDev > Cubidom' 카테고리의 다른 글
| Cubidom 스테이지 시스템 (0) | 2026.03.26 |
|---|---|
| Cubidom Enemy, 카메라,UI 버그 수정 (0) | 2026.03.25 |
| Cubidom 게임 재시작하기 (0) | 2026.03.23 |
| Cubidom 게임 종료 UI (0) | 2026.03.20 |
| Cubidom 적 난이도 세팅 (0) | 2026.03.20 |