GameDev/Cubidom

Cubidom 일시 정지 만들기

SMNNMN 2026. 3. 29. 20:33

이번엔 일시 정지를 만들 것이다.

플레이어가 ESC키를 눌렀을 때, 게임이 즉시 멈추고, 계속하기 버튼과 설정버튼, 메인으로 버튼을 만들것이다.

 

 

일시정지 입력 받기

InputController

       void Update()
    {
        if(GameManager.Instance.myState == GameManager.GameState.START)
        {
            LeftClick();
        }
        Interrupt();
    }
   void Interrupt() // 일시정지 코드
    {
        if(Input.GetKeyDown(KeyCode.Escape))
        {
            if(GameManager.Instance.myState == GameManager.GameState.START)
            {
                GameManager.Instance.GameStop(true);
                UIManager.Instance.InterruptUI(true);
                Time.timeScale = 0;
                Debug.Log("일시정지");
            }
            else if (GameManager.Instance.myState == GameManager.GameState.STOP)
            {
                GameManager.Instance.GameStop(false);
                UIManager.Instance.InterruptUI(false);
                Time.timeScale = 1;
                Debug.Log("일시정지 해제");
            }
        }
    }

Interrupt라는 함수를 통해서 일시정지 입력을 받고, 관리한다.

게임 상태가 Start일때만 정지가 가능하며, Stop상태일때는 일시정지를 해제한다. 

GameManager와 UIManager의 함수를 호출하여 일시정지 기능을 만든다. 

 

GameManager

    public void GameStop(bool myBool) // 게임을 정지하는 단계
    {
        if(myBool)
        {
            myState = GameState.STOP;
        }
        else
        {
            myState = GameState.START;
        }

GameStop에서는 bool 파라미터의 값에 따라 게임을 정지하거나 재개시킨다.

 

UIManager


    [SerializeField] GameObject InterruptObject;
	public void InterruptUI(bool myBool) // 일시정지시 표시되는 UI
    {
        InterruptObject.SetActive(myBool);
    }

InterruptUI 함수의 경우 파라미터의 값에 따라 일시정지 UI를 비/활성화 시킨다.

일시정지 UI는 Panel로 버튼 세개를 묶는 방식으로 만들어져있다.

Panel에는 Vertical LayOut Group이 있기 때문에 버튼 세개는 세로로 정렬하게 된다. 

게임이 시작되는 순간부터 일시정지를 할수 있다. / ESC키를 한번 더 누르면 UI창이 사라지는 것을 볼 수 있다.

 

Continue, Option, Exit 버튼

이제 버튼을 눌렀을 때의 기능을 만들 것이다. Option의 경우 입력처리만 받고, 다음에 따로 만들 것이다. 

GameManager

    public void GameContinue() // 일시정지 상태에서 Continue 버튼 눌렀을 때,
    {
        GameStop(false);
        UIManager.Instance.InterruptUI(false);
        Time.timeScale = 1;
        Debug.Log("일시정지 해제");
    }
    public void GameOption() // 일시정지 상태에서 Option 버튼을 눌렀을 때,
    {
        Debug.Log("설정창");
    }
    public void GameExit() // 일시정지 상태에서 Exit 버튼을 눌렀을 때,
    {
        UIManager.Instance.InterruptUI(false);
        MainScene();
    }

GameContinue는 InputManager에 있던 코드와 같게 사용한다. 

GameExit는 일시정지 창을 비활성화 시키고, MainScene함수를 활용해서 메인화면으로 이동하게끔 한다. 

CameaMovement 오류 해결

    void Move()
    {
        if(Input.GetMouseButton(1) && !isMoving)
        {
            if (myCoroutine != null)
            {
                StopCoroutine(myCoroutine);
                isMoving = false;
            }
            UIManager.Instance.InActiveSeleteBlock();
            InputController.Instance.CancelSelete();

            yaw += Input.GetAxis("Mouse X") * Time.deltaTime * sensitivityX;
            pitch -= Input.GetAxis("Mouse Y") * Time.deltaTime * sensitivityY;

            pitch = Mathf.Clamp(pitch, -30, 80);

            Quaternion rotation = Quaternion.Euler(pitch, yaw, 0);
            offset = rotation * new Vector3(0,0,-distance);

            if(target == null)
            {
                target = fallbackTarget.transform;
            }
            controllCam.transform.position = target.position + offset;
            controllCam.transform.rotation = rotation;
        }
    }
void ChangeMain() // 카메라를 메인카메라로 전환한다. 
    {
        Debug.Log("메인 카메라로 변경");
        ChangeCamera(standbyCam);
        if(myCoroutine != null)
        {
            StopCoroutine(myCoroutine);
        }
    }

Move함수에서 target이 null일때 생겨나는 버그는 fallbackTarget을 사용하여 해결한다. 

ChangeMain함수에서 myCoroutine이 null일 때의 처리를 추가해준다. 

 

완성본