본문 바로가기
게임 프로그래밍/게임개발 중급

게임개발 중급(69) - Monster Killer(31)

by jyppro 2023. 7. 4.

Monster Killer(31)

저번시간엔 일시정지 기능과 버튼UI를 구성하였습니다. 이번에는 놓치고 지나갔던 Pause 상태에서 다시 버튼을 눌러 일시정지 상태를 해제시키는 것과 Exit 버튼을 구성해 보겠습니다. Settings 버튼은 시간 관계상 다음으로 미뤄야 할 것 같습니다.

 

일시정지 해제버튼 UI

처음에는 PausePage에 게임오버 페이지처럼 버튼을 하나 더 만들어 넣어줄까 하다가 기존에 사용하는 일시정지 버튼이 Pause 페이지에 가려져서 눌리지 않는다는 것을 확인했습니다. 그래서 저는 이 버튼을 더 앞으로 배치하여 하나의 버튼만으로 조작할 수 있도록 만들어 줄 생각입니다.

 

사실 이 버튼만 사용한다면 따로 건들여 줄게 없습니다. 왜냐하면 이미 기능은 구현이 되어있기 때문입니다. 그래서 저는 일시정지 상태일때와 게임 중 상태일때의 버튼의 이미지를 바꿔주어서 더 유저가 알아보기 편하게 바꿔주는 작업을 하려고 합니다.

 

버튼 이미지 바꾸기

우선 이 버튼이 PausePage 앞으로 오게 하기위해 하이어라키에서 순서를 바꿔줍니다. 그리고 스크립트를 통해 이미지를 교체해 줍니다.

 

GamePause

using UnityEngine;
using UnityEngine.UI;

public class GamePause : MonoBehaviour
{
    private bool isPaused = false;
    private GameObject GamePauseUI;
     public Sprite newImage; // 변경할 이미지
     public Sprite orignalImage; // 기존 이미지
    private Image buttonImage;

    private void Start()
    {
        GamePauseUI = GameObject.Find("PausePage");
        GamePauseUI.SetActive(false);
        buttonImage = GetComponent<Image>();
        if(GetComponent<UnityEngine.UI.Button>() != null){ GetComponent<UnityEngine.UI.Button>().onClick.AddListener(TogglePause); }
    }

    private void Update()
    { if (Input.GetKeyDown(KeyCode.Escape)) { TogglePause(); } }

    private void TogglePause()
    {
        isPaused = !isPaused;
        if (isPaused)
        {
            GamePauseUI.SetActive(true);
            buttonImage.sprite = newImage;
            Time.timeScale = 0f;
        }
        else
        {
            GamePauseUI.SetActive(false);
            buttonImage.sprite = orignalImage;
            Time.timeScale = 1f;
        }
    }
}

기존의 GamePause 스크립트를 약간 수정하여 이미지를 변경하도록 만들어 주었습니다. 이미지를 아웃렛접속으로 받아와 변수로 저장한다음 버튼이 눌려 게임이 일시정지 되고, 정지가 풀릴 때 이미지를 교체해주는 간단한 스크립트입니다.

 

Exit 버튼

이어서 게임시작화면에 Exit버튼을 통해 게임을 종료하는 스크립트를 작성해 보겠습니다.

 

QuitGameButton

using UnityEngine;
using UnityEngine.UI;

public class QuitGameButton : MonoBehaviour
{
    private void Start()
    {
        Button quitButton = GetComponent<Button>();
        quitButton.onClick.AddListener(QuitGame);
    }

    private void QuitGame()
    {
        // 전처리기 지시문
        #if UNITY_EDITOR
            UnityEditor.EditorApplication.isPlaying = false;
        #else
            Application.Quit();
        #endif
    }
}

게임을 종료하기 위해서는 Application을 종료시켜주어야 합니다. 하지만 지금 저희가 게임을 만들고 있는 에디터 환경에서는 게임을 종료하는 것이 플레이모드를 종료시키는 것이기 때문에 위와 같이 작성해 줍니다. 해당 코드는 전처리기 지시문으로 기존의 if - else문하고는 다릅니다.

 

이제 게임을 실행시켜 만든 기능들이 제대로 작동하는 지 확인하도록 하겠습니다.

 

게임실행

게임종료
게임종료버튼

메인 씬에서 게임을 실행하여 Exit버튼을 클릭하게 되면 위와 같이 에디터로 돌아오게 됩니다. 실제 게임을 빌드하고 눌렀을 때에는 일반적인 게임종료가 이뤄집니다.

 

 다시 메인 씬에서 시작하여 게임플레이를 눌러 게임 씬으로 넘어간다음 일시정지를 시켜보겠습니다.

일시정지
일시정지

일시정지된 상태입니다. 현재 일시정지 버튼의 위치가 Pause화면 앞으로 나와있고, 모습이 바뀐 것을 확인할 수 있습니다.

바뀐 모습의 Pause 버튼을 한번 더 누르면 일시정지가 풀리면서 다시 원래 버튼이미지로 변하게 됩니다.

 

일시정지-해제
일시정지 해제

일시정지를 해제시켰습니다. 버튼의 모습이 다시 돌아오고 PausePage가 없어지며 게임이 진행됩니다.

 

<NEXT>

오늘은 일시정지 상태일 때 버튼 컨트롤과 게임을 시작하기 전 메인 씬에서 Exit으로 게임을 종료하는 버튼을 구현해 보았습니다. 다음에는 미처 하지못한 Settings 버튼의 구현과 설정 창을 만들어 보겠습니다. 감사합니다.