이번엔 일시 정지를 만들 것이다.
플레이어가 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이 있기 때문에 버튼 세개는 세로로 정렬하게 된다.

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일 때의 처리를 추가해준다.
완성본

'GameDev > Cubidom' 카테고리의 다른 글
| Cubidom 시인성 향상1 (0) | 2026.03.31 |
|---|---|
| Cubidom Option창 만들기 - 슬라이더로 카메라 민감도 조절 (0) | 2026.03.30 |
| Cubidom 대포알 제거, 카메라 제어 보완 (0) | 2026.03.28 |
| Cubidom 대포 자동 에임 시스템 (0) | 2026.03.27 |
| Cubidom 스테이지 시스템 (0) | 2026.03.26 |