본문 바로가기
웅진씽크빅 게임 개발 챌린지 일기

개발일지 #31 멈춰!

by 억만장작 2022. 10. 2.

개발일지 #31 게임 속 시간 멈추기, 간단한 Ui 디자인

이번에는 게임 속 시간을 멈추기 위해서 어떻게 했는지에 대해 간단하게 이야기해보려고 한다.

 

바뀐  Ui 디자인

그전에 간단하게 바뀐 Ui를 보자. 사실 바뀌진 않았고 디자이너가 디자인한 Ui만 올리는 거다 ㅎㅎ

이렇게 밋밋했던 체력, 공복, 총알 바가

이렇게 느낌있게 바뀔 예정이다. 디자인은 나왔는데 학교 다니랴 다른 개발하랴 놀랴, 바빠서 아직 적용하지는 못했다.

그리고 아이템을 사용하는 부분이 기존에 그냥 하얀 네모였는데

이런 느낌으로 바뀌었다. 이 부분은 in game에서도 적용된 상태다.

 

시간아 멈춰라.

일시 정지를 누르면 이런 Ui가 튀어나오게 할 것이다.

이 때는 공복 수치도 감소하면 안 되고 적들도 움직이면 안 된다. 적들이 스폰되어서도 안된다.

일시정지 Ui

조그만 문제

여기는 개발적인 재미없는 부분이다. 개발자가 아니라면 지루하니 넘어가자.

 

Unity에서

Time.timeScale = 0;

 

으로 timeScale을 0으로 만들어 주면 시간이 0이 된다. 그럼 모든게 해결될 것이라고 생각했지만 시간이 멈춰버리니 Ui애니메이션도 동작하지 않는 것이다.

그래서 검색을 해보니 Ui애니메이션의 옵션 부분에

Update Mode 옵션이 있고 여기서 Unscaled Time에 체크를 해줘야 시간이 멈춰도 정상 동작을 하더라.

하지만 이걸로 끝났으면 말을 안 꺼냈다.

Script에서 잠시 시간이 지난 후 동작해야 하는 코드들은

Invoke("함수명", 시간);

을 사용했다. 하지만 이 함수는 시간이 멈췄을 때 저 시간이 모두 멈춰버린다. 그래서 시간이 멈춘 상태에서도 시간이 지난 후 동작을 해야하는 함수들이 모두 문제가 생겨 꼬여버렸다.

이 문제를 해결하기 위해 코루틴을 사용했다.

일정 시간이 지난 후 부를 함수의 return type을 IEnumerator로 정해주자. 그리고 그 함수 내부에 yield return (IEnumerator타입)을 넣어주면 그 부분에서 IEnumerator타입을 뭘 넣어줬냐에 따라 그 시간만큼 지난 후 그 부분에서부터 함수를 다시 호출해준다. 이렇게 만들어진 함수를 부를 때는 StartCoroutine(만든 함수());로 사용할 수 있는데 자세한 내용은 공식 홈페이지를 참고해보자.

예시를 한번 보자.

	IEnumerator HidePauseUi()
	{
		uiAnim.SetBool("isShow", false);
		yield return new WaitForSeconds(hidingTime);
		pauseUi.SetActive(false);
		isActive = false;
	}
    
    void Test() 
    {
    	StartCoroutine(HidePauseUi());
    }

이 코루틴 이야기를 왜 했을까. 바로 시간을 멈춘 후에도 동작하는 함수를 만들기 위해서이다.

위의 예시와 같이 WaitForSeconds를 사용하면 시간이 멈췄을 때 함께 멈춘다.

하지만 WaitForSecondsRealtime를 사용하면 시간이 멈췄을 때에도 동작한다.

 

내가 내린 결론은 일정 시간 후에 동작하는 함수를 만들 때에는 코루틴을 사용하자 이다.

마무으리

동작하는 영상은 없다... 아직 만드는 중이라 ㅎㅎ 블로그를 하루 빠뜨렸으니 하나 더 써야겠다... 후딱 일시정지 Ui를 완성해서 글 하나 더 올려야지.

댓글