Unity/IGDC 입문 프로젝트

12. 로비 제작, 게임 오버 시 돌아오게 만들기

말하는 닭 2023. 11. 10. 02:53

 

로비를 제작하여 게임을 플레이하는 씬으로 넘어오게 하겠습니다. 

새로운 씬 하나를 만들어줍니다. 

 

그 후, UI의 Panel을 하나 만들어줍시다.

Inspector에서 Image 컴포넌트의 Color 속성을 통해 색이나 투명도를 바꿀 수 있습니다. 

 

버튼과 텍스트 하나씩 해서 간단하게 로비 씬을 만들어보았습니다. 

 

그 후, 씬 이동 스크립트를 하나 만들어주고, 다음과 같이 작성해줍니다. 

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneMove : MonoBehaviour
{
    public void GoToBattleScene() {
        SceneManager.LoadScene("SampleScene");
    }
}

 

LoadScene 안에 파라미터는 이동하고 싶은 씬의 이름을 적어주시면 됩니다. 

숫자도 기입할 수 있습니다 .

 

----- Scenes In Build 설정하기 ------

File > Build Settings로 들어가면 아래와 같은 창이 나타닙니다. 

Add Open Scenes 버튼을 통해 현재 자신이 있는 씬을 추가할 수 있고, 사각형 안에 프로젝트 창에 있는 씬 아이콘을 끌어다놓다 추가할 수도 있습니다.

 

빌드했을 때에 포함시킬 씬을 넣는 자리로, 만약 씬 추가를 깜빡하고 빌드를 하는 경우, 실행 파일을 열어도 아무 것도 보이지 않는 일이 발생할 수 있습니다. (에디터 상에서는 추가 안 해도 잘 작동합니다)

 

추가를 하게 된다면 씬의 경로 및 이름과 우측 끝에 숫자가 써 있는데, LoadScene 함수의 파라미터로 저 숫자를 넣으면 숫자에 맞는 씬으로 이동하게 됩니다. 

 

-------------------------------------

 

후, 빈 오브젝트를 만들어 SceneMove 스크립트를 붙이고, 버튼을 클릭했을 때 잘 작동할 수 있도록 해줍시다. 

 

버튼을 누르면 지금까지 만들어왔던 디펜스 씬으로 잘 이동이 됩니다. 

 


로비에서 게임 씬으로 갔으니, 게임에서 로비로 돌아올 수 있도록 게임 오버 시 돌아오는 버튼을 만들어봅시다. 

 

새로 만든 씬을 잘 저장하고 다시 디펜스 만들던 씬으로 돌아옵시다. 

 

간단하게 게임 오버 시 띄울 UI를 만들었습니다. (텍스트와 버튼은 Panel의 자식 오브젝트입니다)

Panel의 Enabled를 꺼놓습니다. 

 

게임이 종료되면 로그를 찍어줬던 스크립트는 GameManager 스크립트였습니다. 

public GameObject gameOverPanel;
public void GameOver() {
    Debug.Log("게임이 종료되었습니다");

    gameOverPanel.SetActive(true);
    Time.timeScale = 0f;
}

패널을 담을 변수 하나를 만들고, 위에서 만들었던 패널을 이 변수에 넣어주세요.

게임이 종료되면 패널이 보일 수 있도록 active를 true로 만들어줍니다. 

 

그리고 게임이 종료되면 모든 움직임이 멈추도록 timeScale을 0으로 만들어줍니다. 

timeScale은 유니티 내에서 시간이 흐르는 속도로, 0이 되면 시간이 흐르지 않고 1일 때는 실제 시간만큼 흐름니다. 1보다 큰 값을 넣어 빠르게 흐르게 할 수 있지만, 음수 값은 무시됩니다. 만약 0.5를 넣었다면 시간이 2배로 느리게 흐르겠지요!

 

SceneMove 스크립트에 다음 함수를 추가하고, 위와 같은 방식으로 버튼을 눌렀을 때 이 함수를 실행시킬 수 있도록 이어줍니다. 

public void GoToLobby() {
    SceneManager.LoadScene("New Scene");
}

 

몬스터가 마지막 타워에 부딪혀도 계속 남아있던 문제도 해결해봅시다.

Enemy 스크립트에서 Finish 태그를 가진 오브젝트와 부딪혔을 때, Hp를 하나 깎게 하고 자신을 없애면 됩니다. 

일전에 만들었던 Die 함수를 추가해주면 끝납니다. 

 private void OnTriggerEnter(Collider other) {
    if (other.gameObject.CompareTag("Finish")) {
        other.gameObject.GetComponent<AllyTower>().Hp--;
        Die();    /// -> 추가된 내용
    }
    else if (other.gameObject.CompareTag("Projectile")) {
        Hp--;
        Destroy(other.gameObject);
    }
}

 

 

 

 

잘 동작하는지 확인해봅니다. 

로비에서 버튼을 누르면 게임이 시작되고, 몬스터가 특정 수 만큼 도달했을 때 게임 종료 패널이 뜹니다. 

버튼을 눌러 다시 로비로 돌아올 수도 있구요.

 

하지만, 로비로 돌아오고난 후에 다시 버튼을 눌러 게임 씬으로 넘어가면, 몬스터가 스폰되지 않습니다.

이는 Unity에서는 왔다갔다하면서 씬을 초기화해주지 않아서 그렇습니다. 아까 timeScale을 0으로 지정한 것이 씬을 넘나들다 와도 남아있는 것이지요. 

GameManager 스크립트의 Awake 함수에서 다음 구문을 추가해주어 timeScale을 다시 1로 조정합시다. 

Time.timeScale = 1.0f;

 

이렇게 하면 다시 돌아오더라도 문제없이 작동하는 것을 볼 수 있습니다. 

'Unity > IGDC 입문 프로젝트' 카테고리의 다른 글

11. 타워 업그레이드 및 제거 기능 구현  (0) 2023.11.07
10.5 - 버튼 클릭 수정  (0) 2023.11.07
10. 에러 수정  (0) 2023.09.19
9. 공격 타워 배치 및 Cost 기능 구현  (0) 2023.09.03
8. 공격 타워 구현  (0) 2023.09.03