1. 코루틴(coroutines)이란?
C#과 Unity에서 코루틴은 비동기, 시간 경과에 따라 또는 작은 단계로 실행되는 코드를 생성하는 데 사용할 수 있는 특수한 유형의 반복자 메서드입니다. 코루틴을 사용하면 복잡한 다단계 작업을 더 작은 코드 조각으로 분할하여 독립적으로 실행하고 보다 제어된 방식으로 실행할 수 있습니다.
2. 코루틴(coroutines)의 예시
다음은 C# 코루틴의 예시입니다:
using System.Collections;
using UnityEngine;
public class Example : MonoBehaviour
{
private IEnumerator coroutine;
void Start()
{
coroutine = MyCoroutine();
StartCoroutine(coroutine);
}
IEnumerator MyCoroutine()
{
Debug.Log("Coroutine started");
yield return new WaitForSeconds(2.0f);
Debug.Log("Two seconds have passed");
yield return new WaitForSeconds(3.0f);
Debug.Log("Another three seconds have passed");
}
}
이 예제에서 MyCoroutine() 메서드는 반환 유형이 IEnumerator로 선언되어 있습니다. 이는 StartCoroutine() 메서드를 사용하여 비동기적으로 실행할 수 있는 코루틴임을 나타냅니다.
MyCoroutine() 메서드는 콘솔에 메시지를 로깅하고, yield return new WaitForSeconds(2.0f) 문을 사용하여 2초 동안 기다린 다음, 또 다른 메시지를 콘솔에 로깅하고, 다시 3초 동안 기다린 다음 최종 메시지를 로깅합니다. yield 반환 문은 코루틴이 계속하기 전에 일시 중지하고 지정된 시간 동안 기다릴 수 있도록 합니다.
Start() 메서드에서는 코루틴 변수에 MyCoroutine() 메서드가 할당된 다음 StartCoroutine() 메서드를 사용하여 시작됩니다. 이 코드가 실행되면 MyCoroutine() 메서드가 비동기적으로 실행되어 나머지 코드가 계속 실행될 수 있습니다. yield 반환 문은 코루틴을 계속하기 전에 지정된 시간 동안 일시 중지하도록 하여 여러 프레임에 걸쳐 또는 시간에 걸쳐 복잡한 동작을 생성할 수 있습니다.
3. 코루틴과 스레드의 차이
코루틴 :
코루틴은 단일 Unity 스크립트 내에서 코드를 비동기적으로 실행할 수 있는 Unity 전용 기능입니다.
코루틴은 실행 중에 yield 키워드를 사용하여 일시 중지했다가 다시 시작할 수 있는 특수 메서드로 정의됩니다.
코루틴은 게임을 렌더링하고 사용자 입력을 처리하는 스레드인 Unity 메인 스레드에서 실행됩니다.
코루틴은 일반적으로 시간 기반 지연, 애니메이션, 순차적 동작 및 코드 실행 타이밍을 세밀하게 제어해야 하는 기타 작업을 구현하는 데 사용됩니다.
코루틴은 스레드 동기화 메커니즘 없이도 Unity의 오브젝트 및 컴포넌트와 직접 상호 작용할 수 있으므로 Unity 개발에 적합합니다.
스레드 :
스레드는 프로그래밍의 기본 개념으로, 프로그램 내에서 독립적인 실행 시퀀스를 의미합니다.
스레드를 사용하면 코드의 여러 섹션을 동시에 실행할 수 있으며 서로 다른 프로세서 코어에서 병렬로 실행할 수 있습니다.
Unity에서는 System.Threading 네임스페이스를 통해 스레드를 사용하여 백그라운드 계산이나 시간이 오래 걸리는 작업(Unity 오브젝트와 직접 상호 작용할 필요가 없는 작업)을 수행할 수 있습니다.
스레드는 동시에 실행되며 메인 스레드와 독립적으로 코드를 실행할 수 있습니다. 스레드는 복잡한 계산, 파일 I/O 작업, 네트워크 통신 또는 계산 집약적인 작업과 같은 작업에 사용할 수 있습니다.
하지만 Unity로 작업할 때는 Unity의 API가 스레드에 안전하지 않으므로 메인 스레드 이외의 스레드에서 Unity의 오브젝트나 컴포넌트에 직접 액세스하거나 수정해서는 안 된다는 점에 유의해야 합니다.
스레드에서 Unity의 오브젝트와 상호 작용하려면 메인 스레드 디스패처 또는 Unity 스레드와 같은 메커니즘을 사용해야 합니다.
요약하자면, Unity 코루틴은 단일 스크립트 내에서 비동기 코드 실행을 관리하기 위한 Unity 고유의 기능입니다. 시간 기반 지연, 애니메이션, 기타 타이밍을 세밀하게 제어해야 하는 작업을 구현하는 데 이상적입니다. 반면 스레드는 코드를 동시에 실행할 수 있는 일반적인 프로그래밍 개념으로, Unity의 메인 스레드와 독립적으로 실행할 수 있습니다. 스레드는 백그라운드 계산이나 시간이 오래 걸리는 작업을 수행하는 데 유용하며, Unity 오브젝트와 직접 상호 작용할 필요가 없습니다. Unity로 작업할 때는 스레드 안전을 보장하고 스레드에서 Unity의 오브젝트와 상호 작용할 때 적절한 메커니즘을 사용해야 한다는 점에 유의해야 합니다.
4. 결론
코루틴은 일반적으로 애니메이션을 생성하고, 오브젝트를 스폰하고, 시간에 따라 또는 플레이어 입력에 따라 실행해야 하는 기타 작업을 수행하기 위해 Unity 게임 개발에서 사용됩니다. 코루틴은 프레임에 구애받지 않는 부드러운 움직임과 애니메이션을 생성하는 데에도 사용할 수 있으며, 이는 다양한 하드웨어 구성에서 일관된 성능을 유지하는 데 중요합니다.
위 예제에 표시된 yield return new WaitForSeconds() 문 외에도 C# 및 Unity 코루틴에서 사용할 수 있는 yield 문에는 yield return null, yield return new WaitForEndOfFrame(), yield return StartCoroutine(otherCoroutine) 등 여러 가지 다른 유형의 yield 문이 있습니다. 이러한 문을 사용하면 코루틴을 사용하여 훨씬 더 복잡한 동작을 생성할 수 있습니다.
'공부 > C#' 카테고리의 다른 글
짐벌락(gimbal lock)이란? (0) | 2023.03.06 |
---|---|
Yield 키워드란? (0) | 2023.03.06 |
이벤트(event)란? (0) | 2023.03.06 |
델리게이트(Delegate)란? (0) | 2023.03.05 |
C#에서 Dictionary는 맵일까?, 해쉬 맵일까? (0) | 2023.03.05 |