[Unity] 코루틴과 비동기 프로그래밍

고현규·2023년 12월 18일
0

Async, Await

  • Async - 메서드가 비동기적으로 작동할 수 있음을 나타냄
  • Await - 비동기 작업이 완료될 때까지 현재 메서드의 실행을 일시 중단하고, 완료되면 실행을 계속함
public  class AsyncExample : MonoBehaviour
{
	async void Start()
    {
    	Debug.Log("데이터 로딩 시작");
        await LoadDataAsync();
        Debug.Log("데이터 로딩 완료");
    }
    
    async Task LoadDataAsync()
    {
        await Task.Delay(2000);
    }
}

Asymc/Await 예외처리

async Task PerformTaskWithExceptionHandlingAsync()
{
	try
    {
    	await Task.Delay(1000);
        throw new System.Exception("에러 발생");
    }
    catch (System.Exception e)
    {
        Debug.LogError($"비동기 작업 중 에러 발생: {e.Message}");
    }
}

비동기 작업 중 발생하는 예외를 처리하는 것이 중요하다.

비동기 프로그래밍 사례

  • 이미지 처리, 데이터 로딩, 네트워크 통신
  • 성능과 메모리 관리를 위해 제한된 자원 내에서 고려해야한다.

Coroutine

  • 일반 함수와 달리 여러 프레임에 걸쳐서 실행될 수 있고, 일시 중단하고 다시 시작할 수도 있음.
  • 시간 지연, 비동기적 작업 처리, 순차적 이벤트 처리
public class FadeScripts : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(FadeOut());
    }
    
    IEnumerator FadeOut()
    {
        float fadeDuration = 3f;
        float elapsedTime = 0f;
        
        while (elapsedTime < fadeDuration)
        {
            elapsedTime += Time.deltaTime;
            float alpha = 1 - (elapsedTime / fadeDuration);
            
            yield return null;
        }
    }
}

코루틴은 게임의 주된 실행 흐름을 방해하지 않으면서
별도의 실행흐름을 만들어 낸다. (완전히 독립적이지는 않음)

코루틴이 어러개 동시에 시작하고, 각각 독립적으로 실행될 수 있다.

void Start()
{
	StartCoroutine(CoroutineA());
    StartCoroutine(CoroutineB());
}

IEnumerator CoroutineA()
{
    yield return new WaitForSeconds(2);
}

IEnumerator CoroutineB()
{
	yield return new WaitForSeconds(3);
}
profile
게임 개발과 기획

0개의 댓글

관련 채용 정보