반응형
유니티 스크립트에서 일반 함수와 코루틴의 차이는 다음과 같습니다.
일반 함수 → 함수가 호출된 현재 프레임에서 함수의 내용을 모두 처리
코루틴 → 여러 프레임에 걸쳐 처리
코루틴에서는 "yield return ..." 구문을 만나면 여기서 제시된 조건 동안 코드 수행의 제어권을 유니티에게 반환하고 코루틴 함수는 잠시 중단됩니다. 이후 다른 프레임에서 중단된 코드를 이어서 수행할 수 있게 됩니다. (조건에 대한 자세한 내용은 이글의 하단에 있습니다.)
코루틴 함수는 다음과 같은 규칙으로 사용할 수 있습니다.
- IEnumerator 라는 반환 값을 갖는 함수로 작성해야 합니다.
- 코루틴 함수 내부에 반드시 yield 키워드가 한 번 이상 사용되어야 합니다.
- 코루틴 함수는 StartCoroutine 을 사용해 호출해야 합니다.
프리팹 기초 강의에서 사용했던 코드 중 코루틴과 관련된 코드를 예제로 사용해 보도록 하겠습니다.
void Start()
{
StartCoroutine(SpawSlime());
}
IEnumerator SpawnSlime()
{
while (Application.isPlaying)
{
Vector3 p = Random.insideUnitSphere * 25;
Vector3 pos = new Vector3(p.x, 0f, p.z);
var slime = Instantiate(slimePrefab, pos, Quaternion.identity);
yield return new WaitForSeconds(1f);
}
}
▶ SpawnSlime은 코루틴 함수 입니다.
▶ yield return 다음에 올 수 있는 구문의 종류는 다음과 같습니다.
- null : 다음 프레임의 Update() 가 호출이 종료될 때까지 대기
- new WaitForEndOfFrame() : 현재 프레임이 종료될 때까지 대기
- new WaitForFixedUpdate() : 다음 프레임의 FixedUpdate() 가 호출이 종료될 때까지 대기
- new WaitForSeconds(sec) : 인자로 넘겨주는 시간(초) 동안 대기 (1f = 1초). Time.timeScale의 영향을 받습니다.
- new WaitForSceondsRealtime(sec) : 인자로 넘겨주는 시간(초) 동안 대기. Time.timeScale의 영향을 받지 않습니다.
- new WaitUntil(statement) : statement 가 true 가 될 때까지 대기
- new WaitWhile(statement) : statement 가 true 인 동안 대기
- StartCoroutine() : 다른 코루틴 함수를 실행하고 해당 코루틴이 종료될 때까지 대기합니다.
▶ 위의 코드에서 yield return WaitForSeconds(1f) 구문이 실행되면 여기서 1초 동안 코루틴 함수가 중단됩니다. 그 동안 유니티는 다른 처리를 수행하게 됩니다. 1초 후에는 다시 코루틴 함수의 다음 내용이 수행됩니다.이 코드에서는 while 문의 조건을 다시 검사하는 코드가 수행됩니다.
▶ 코루틴은 시간 혹은 프레임에 따라 점진적으로 처리되어야 하는 작업에 유용하게 사용할 수 있습니다.
반응형
'게임 프로그래밍 > 유니티(2021.3 LTS) 강좌' 카테고리의 다른 글
[유니티 강좌] UI - Anchor 의 Min, Max (0) | 2022.11.23 |
---|---|
유니티 UI - Anchor, Pivot, Position (0) | 2022.11.21 |
[유니티 기초] 게임 실행 중 프리팹 오브젝트 생성 (0) | 2022.10.25 |
[유니티 기초] 프리팹 (Prefab) - 동기화 (2) | 2022.10.25 |
[유니티 기초] 에셋 스토어 (Asset Store) 사용 (0) | 2022.10.24 |
댓글