본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티unity로 게임 만들기

유니티48_게임 제작 과정 17_Coroutine_IEnumerator

Coroutine 코루틴

 

코루틴은 실행을 일시 중지하고 Unity에 제어권을 반환한 후 다음 frame(프레임)에서 중단했던 위치에서 계속할 수 있는 함수이다.

 

네임스페이스 System.Collections에 있는 IEnumerator 인터페이스를 반환 타입으로 정의한다.

그리고 코루틴 호출StartCoroutine() 메서드를 이용해 호출한다.

 

코루틴이 어떤 기능을 하는지 예를 만들어 본다.

 

 

위 코드를 실행하면 순서대로 1, 2, 3이 출력된다.

먼저 7번 줄에서 First메서드를 호출하여 실행되고 1이 출력된다. 

계속해서 14번 줄에서 Second메서드가 호출되고 2가 출력된다.

여기까지 First메서드 실행이 끝난 후 8번 줄 Debug.Log가 실행되어 3이 출력된다.

 

위 코드를 코루틴으로 변경하면 다음과 같다.

 

코루틴을 사용하기 위해 2번줄에 using System.Collections를 등록한다.

8번 줄에 StartCoroutine( )메서드를 이용해서 First()메서드를 호출한다.

First메서드는 반환타입으로 IEnumerator 인터페이스로 정의한다.

여기에서 1이 출력된다.

15번 줄에 yield return 문에서 다음 프레임까지 제어권을 호출한 Start()메서드에 넘긴다.

다시 Start()메서드가 실행되어 계속해서 9번 줄이 실행되고 3이 출력된다.

 

yield는 '양보하다' , '포기하다'라는 뜻이다.

그러므로 yield return은 '여기서 일단 양보하고 반환한다' 라는 뜻의 구문이다.

null(널)은 아무것도 반환하지 않는다는 뜻이다.

 

다시 16번 줄로 이동하여 StartCoroutine( )메서드가 실행되어 Second()메서드를 호출한다.

19번 줄로 이동하여 2가 출력된다.

22번 줄에서 yield return문에서 다시 제어권을 Start()메서드로 넘긴다.

 

 

위의 예처럼 코루틴을 사용하면 코드의 흐름을 제어할 수 있는 기능이 생긴다.

코루틴 기능과 반복문을 함께 사용해서 흐름을 제어하고 new WaitForSeconds( )를 사용하면 일정 시간을 기다린 후에 계속 작동하도록 조절할 수 있다.

 

폭탄 타이머를 1초 씩 줄어들게 하다가 시간이 다 되면 '펑'을 출력하는 예를 하나 더 만들어본다.

 

using System.Collections를 등록한다.

10번 줄에서 '타이머 시작'이 출력된다.

11번 줄에서 코루틴으로 TimeBomb(시한폭탄) 메서드가 호출된다.

 

14번 줄에서 코루틴으로 호출하는 메서드는 IEnumerator타입으로 정의한다.

16번 줄에서 timeLeft 값이 0보다 작을 동안(while) 반복한다.

timeLeft값을 가져와서 남은 시간을 표시한다.

yield return문에서 1초 기다린 후 Start()메서드에게 제어권을 넘긴다.

timeLeft값을 1 감소시킨다. timeLeft 값이 0보다 크면 18번 줄을 다시 실행한다.(반복)

timeLeft값이 0보다 크지 않으면 Boom(펑) 메서드를 호출한다.

 

27번 줄의 문자열을 출력한다.

 

위의 예 처럼 지연 시간을 주고 싶으면 null 대신 new WaitForSeconds(시간 간격) 메서드를 사용한다.

*wait for seconds : 몇 초 기다리다

 

이제 PrefabManager.cs의 Invoke( )메서드로 일정 시간 후에 적을 반복 생산했던 코드를 코루틴으로 구현할 수 있다.

 

public void EnemyRandom() 메서드를 public IEnumerator EnemyRandom() 메서드로 수정한다.

이 코루틴이 호출되면 while 반복문이 실행되고 true(참), 즉 코루틴이 참인 동안(실행되는 동안) 계속 반복한다는 뜻이다.

위 코드는 결국 1초 간격으로 적이 만들어질 것이다.

 

EnemyRandom메서드는 GameManager의 OnClickStartButton메서드에서 실행했기 때문에 위 코루틴의 실행을 위해서 코드를 다음과 같이 수정한다.

 

끝.

Wraven...