Coroutines는 메인 게임 실행 사이클과 동시에 수행될 수 있는 함수입니다...
이 튜토리얼의 동영상 버전은 현재 이 언어로 제공되지 않습니다. 아래에서 자막이 포함된 영어 버전을 시청할 수 있으며, 동영상 아래에는 한국어로 번역된 스크립트가 있습니다.
영상 자막 텍스트
안녕하세요 여러분!
Unity에서 Coroutines를 사용하는 방법에 대한 기본 튜토리얼에 오신 것을 환영합니다.
Coroutines는 메인 게임 실행 사이클과 동시에 수행될 수 있는 함수입니다.
이 튜토리얼에서는 실용적인 예제를 사용하여 개념을 설명하고, 지정한 초 수만큼 작업 실행을 기다릴 수 있게 해주는 WaitForSeconds 함수도 함께 소개하겠습니다.
이 튜토리얼은 Unity에서 C# 프로그래밍에 대한 기본적인 이해를 전제로 합니다. Unity 2022 버전을 사용하여 녹화되었지만, Coroutines는 다양한 프로그래밍 언어와 이전 Unity 버전에서도 사용할 수 있습니다.
우리의 목표는 외부 이벤트가 발생하여 이 루틴을 중단할 때까지 대포가 cannonball Prefab, 즉 단순한 검은색 구체를 3초마다 자동으로 발사하도록 만드는 것입니다.

이 경우 외부 이벤트는 사용자가 S 키, 즉 "Stop"을 누르는 것입니다.
먼저 대포용 스크립트를 생성하고 이름을 "autoshoot"으로 지정합니다.
메인 클래스 내부에서 대포를 기준으로 공이 생성될 시작 지점을 지정하기 위해 세 개의 변수를 정의합니다.
public GameObject spawnPrefab;
이 public 변수에는 Unity Editor에서 cannonball prefab을 연결할 것입니다.
Vector3 spawnPosition;
Quaternion spawnRotation;
이 지점과 초기 방향은 이미 계산해 두었으므로 Start 함수 안에서 다음과 같이 두 값을 초기화합니다.
spawnPosition = transform.position + new Vector3(-1.2f, 1.8f, 0f);
spawnRotation = Quaternion.Euler(-10f, -90f, 0f);


이제 외부 이벤트가 이를 중단하지 않는 한 무한히 반복되는 루프를 구현해야 한다는 것은 분명합니다. 또한 다음 반복으로 넘어가기 전에 3초 지연 명령을 포함해야 합니다.
참고로 cannonball prefab에는 시작 시 공에 전방 초기 힘을 가하고, 3초 후에 오브젝트를 자동으로 삭제하도록 설정하는 스크립트가 포함되어 있습니다. 이는 가상 공간이나 시스템 메모리가 cannonball로 가득 차는 것을 방지하기 위함입니다.
WaitForSeconds 명령은 지정한 시간 동안 실행을 일시 중지할 수 있게 해주며, 우리의 경우에는 3초입니다.
이제 현재 스크립트의 빈 공간에 메인 루프를 작성하면서 WHILE 블록을 만들어야 합니다.
while(true) {
GameObject cannonBall = Instantiate(spawnPrefab, spawnPosition, spawnRotation, null);
yield return new WaitForSeconds(3);
}
그렇다면 이 WHILE 블록은 어디에 배치해야 할까요?
Start 안에는 배치할 수 없습니다. 그 안에서는 yield WaitForSeconds를 사용할 수 없기 때문입니다. 또한 Update에 넣으면 Update는 게임의 매 프레임마다 호출되므로 지연이 적용되지 않습니다.
따라서 반환 타입이 IEnumerator인 "shoot"이라는 함수를 생성하고, 그 안에 WHILE 블록을 포함해야 합니다.
이 함수는 StartCoroutine 명령을 사용하여 Coroutine을 시작할 수 있게 해주며, 함수 이름을 큰따옴표로 감싸 매개변수로 전달합니다.
대포는 즉시 발사를 시작해야 하므로, spawnPosition과 spawnRotation을 초기화한 직후 Start 안에 다음과 같이 작성합니다.
StartCoroutine("shoot");
이제 스크립트를 저장하고 지금까지 정의한 내용을 Unity Editor에서 실행해 보겠습니다.
Coroutine을 중지하거나 다시 시작할 수 있도록 스크립트로 돌아가 두 개의 구문을 추가하겠습니다.

S 키가 눌렸는지 확인한 뒤 StopCoroutine 함수에 "shoot" Coroutine을 매개변수로 전달하여 Coroutine을 중지할 수 있습니다.
마찬가지로 R 키가 눌렸는지 확인한 뒤 StartCoroutine 함수에 "shoot"을 매개변수로 전달하여 Coroutine을 다시 시작할 수 있습니다.
따라서 Update 안에 다음과 같이 작성합니다.
if(Input.GetKeyDown(KeyCode.S)) StopCoroutine("shoot");
if(Input.GetKeyDown(KeyCode.R)) StartCoroutine("shoot");

이 구문을 추가한 후 스크립트를 저장하고 Unity Editor로 돌아가 실행해 보겠습니다.
이 짧은 튜토리얼은 여기까지입니다. 도움이 되었기를 바랍니다. 곧 다시 만나요!