async UniTask Foo(UniTask task)
{
    Log("1");
    await task;
    Log("3");
}

async UniTask Bar()
{
    Log("2");
    await UniTask.CompletedTask;
}

void main()
{
    Foo(Bar()).Forget();
}

이 코드는 어떻게 작동할까?

아마도 1, 2, 3 처럼 작동되리라 기대할 것이다

하지막 실제로 코드를 실행해보면 2, 1, 3 순서대로 호출된다

UniTask는 Action 과 다르게 인자로 넘기는 순간 async 특성상 UniTask 메서드가 실행되어 버리기 때문이다

의도처럼 1, 2, 3 대로 실행을 하기 위해서는, 메서드의 인자로 Action 을 받거나,

Foo(Bar) 처럼 그냥 넘겨주는 대신 Foo(UniTask.Defer(Bar)) 와 같이 await 를 만날때 실제로 평가되는 Defer 기능을 사용해야 한다

Changelog


main 메서드 내 오타가 있어 수정했습니다 (2023.06.12 17:31)