
코루틴(coroutine)은 작업을 여러 프레임에 분산시킬 수 있는 메서드이다.
일반적인 메서드들은 프레임에 한번 호출되면 끝나지만, 코루틴은 실행을 잠시 멈추고 다음프레임에 계속 이어서 호출 될 수 있다.
그러나 이게 코루틴이 비동기적으로 실행된다는 의미는 아니다. 코루틴의 작업은 메인 스레드에서 진행되지만, 마치 비동기로 진행되는 것처럼 실행될 뿐이다.
다음은 코루틴을 사용한 예시코드이다.
public class BlinkCoroutine : MonoBehaviour
{
private SpriteRenderer spriteRenderer;
private Coroutine coroutine;
private void Awake()
{
spriteRenderer = GetComponent<SpriteRenderer>();
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (coroutine == null)
{
coroutine = StartCoroutine(Blink());
}
}
private IEnumerator Blink()
{
while (true)
{
spriteRenderer.enabled = false;
yield return null;
spriteRenderer.enabled = true;
yield return null;
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (coroutine != null)
{
StopCoroutine(coroutine);
coroutine = null;
spriteRenderer.enabled = true;
}
}
}
해당코드는 is trigger된 오브젝트 위에 올라가 있으면 스프라이트가 깜박이고, 내려오면 깜박임이 멈추는 코드이다.
코루틴을 시작할 때는 courutine = StartCoroutine(Blink()); 처럼 StartCoroutine(메서드) 형식으로 해당 코루틴을 시작할 수 있다.
StartCoroutine()에 매개변수가 되는 메서드는 IEnumerator를 반환해야한다.
반환은 위 코드처럼 yield return new WaitForSeconds(0.1f);이나 yield return null; 같은 식으로 올 수 있다.
이 외에도 여러 반환 방법이 있지만, 공통점은 return만큼 해당 코루틴을 종료한다는 뜻이다.
이를태면 yield return new WaitForSeconds(0.1f);에서는 0.1초동안 멈추고 다음 코드를 실행한다는 뜻이다.
yield return null;는 시간이 아닌 바로 다음 프레임을 불러온다.
코루틴을 멈출 때는 StopCoroutine(courutine); 으로 멈출 수 있다. 예시코드에서는 OnTriggerExit2D했을 때, 코루틴을 멈추고 coroutine을 null로 초기화하는 것 까지 진행했다.
'내일배움캠프 TIL' 카테고리의 다른 글
| 내일배움캠프 30일차 TIL "CursorLockMode" (0) | 2024.10.25 |
|---|---|
| 내일배움캠프 29일차 TIL "Raycast" (0) | 2024.10.24 |
| 내일배움캠프 27일차 TIL "오브젝트 풀링" (0) | 2024.10.22 |
| 내일배움캠프 26일차 TIL "UI에서의 Anchor" (0) | 2024.10.21 |
| 내일배움캠프 25일차 TIL "레이어를 통한 충돌 처리" (0) | 2024.10.18 |