ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 인게임 메뉴 만들기 - 게임 일시정지, 재시작 등
    쾌락없는 책임 (공부)/Unity 2021. 3. 14. 20:06
    반응형
    참고 영상

     

    Youtube - BracKeys
    유니티 내 세팅

    - 유니티 하이어라키 창에서 Create > UI > Canvas, Panel을 통해서 일시정지를 위한 패널을 만들어 둔 뒤 각 버튼들을 세팅, 일단은 비활성화 했습니다

     

     

     

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    //using UnityEngine.SceneManagement;
    
    public class PauseMenu : MonoBehaviour{
        // 다른 스크립트에서 쉽게 접근이 가능하도록 static
        public static bool GameIsPaused = false;
        public GameObject pauseMenuCanvas;
        void Update(){
            if(Input.GetKeyDown(KeyCode.Escape)){
                if(GameIsPaused){
                    Resume();
                } else {
                    Pause();
                }
            }
        }
    
        public void Resume(){
            pauseMenuCanvas.SetActive(false);
            Time.timeScale = 1f;
            GameIsPaused = false;
        }
    
        public void Pause(){
            pauseMenuCanvas.SetActive(true);
            Time.timeScale = 0f;
            GameIsPaused = true;
        }
    
        public void ToSettingMenu(){
            Debug.Log("아직 미구현입니다...");
        }
    
        public void ToMain(){
            Debug.Log("아직 미구현입니다...");
            //Time.timeScale = 1f;
            //SceneManager.LoadScene("MainMenu");
        }
    
        public void QuitGame(){
            Debug.Log("아직 미구현입니다...");
            Application.Quit();
        }
    }
    

     또한 위 스크립트가 담깉 파일을 만들고 이 파일을 위 Canvas에 넣어 뒀습니다.

     

    이후 각 버튼에는 이런 식으로 해당하는 함수를 지정해 버튼을 클릭하면 함수를 호출하게 제작을 했습니다.

     

     

     

     

    위 스크립트의 기능
        public GameObject pauseMenuCanvas;
        void Update(){
            if(Input.GetKeyDown(KeyCode.Escape)){
                if(GameIsPaused){
                    Resume();
                } else {
                    Pause();
                }
            }
        }

     GameObject 변수에 일시정지 메뉴를 위해 만든 Panel을 넣어 둔 뒤 Esc키를 누름에 따라 메뉴를 부르고, 지우는 역할을 하게 했습니다.

     만약 현재 메뉴가 불러져 있다면 (GameIsPaused == true) Resume를 호출하고 아니라면 Pause를 호출하게 했습니다.

        public void Resume(){
            pauseMenuCanvas.SetActive(false);
            Time.timeScale = 1f;
            GameIsPaused = false;
        }
    
        public void Pause(){
            pauseMenuCanvas.SetActive(true);
            Time.timeScale = 0f;
            GameIsPaused = true;
        }
    
        public void ToSettingMenu(){
            Debug.Log("아직 미구현입니다...");
        }
    
        public void ToMain(){
            Debug.Log("아직 미구현입니다...");
            //Time.timeScale = 1f;
            //SceneManager.LoadScene("MainMenu");
        }
    
        public void QuitGame(){
            Debug.Log("아직 미구현입니다...");
            Application.Quit();
        }

     위 함수들은 각 기능을 하는 버튼들로 Time.timeScale를 이용해 게임을 일시정지, 진행 하게 했으며 pauseMenuCanvus에 담아둔 패널을 SetActive를 통해 끄고 켤 수 있게 했습니다.

     나머지 함수들의 경우 이후 메인 메뉴 제작, 음향 설정에 대해서 배운다면 추가할 계획입니다.

     

    여기서 주의할 것
        public static bool GameIsPaused = false;

     위 영상을 시청한다면 알 수 있지만 Time.timeScale에 영향을 받지 않는 요소들이 있습니다. 제가 알아본 바로는

        - Update : 계속해서 함수 호출    /    FixedUpdate : 호출하지 않음

        - 코루틴의 WaitForSeconds : 멈춤    /    WaitForSecondsRealtime : 안멈춤

     정도가 있습니다.

     

     여기서 저 변수를 static으로 선언한 이유가 있는데, 만약 게임 일시정지를 했을 시 작동되지 않아야 할게 작동이 된다면 코드에 if (GameIsPaused) 와 같은 조건문을 넣어 제어할 수 있게 할 의도입니다. 전역으로 선언했으니 모든 스크립트에서 추가 과정 없이 간단하게 접근이 가능합니다.

    반응형

    댓글

Designed by Tistory.