Unity. Переходим на UniTask
Jun 2025UniTask - это легковесная версия Task адаптированная для использования в коде игры, а если бы точнее в использовании внутри игрового цикла.
UniTask представляет собой структуру, поэтому использование его не приводит к аллокациям в heap памяти.
Работает на основном потоке Unity, что означает доступ к API самого Unity из любого места. Для примера сочетание Coroutine + Task может приводит к ошибкам в рантайме, что тот или иной метод Unity неизвестен. Причиной тому служит то что Task запустился на своем потоке без Unity API.
Отличия UniTask от Coroutine
UniTask может использоваться вне MonoBehaviour, в то время как Coroutine жестко к нему привязан.
UniTask может возвращать результат.
UniTask использует привычные для C# конструкции async-await.
У UniTask меньше накладные расходы по сравнению с Coroutine: меньше heap аллокаций для IEnumerator.
Меньше специфики характерной для Coroutine: замыкания, невозможность использовать try-catch, отсутствие возвращаемого значения и прочее.
После установки UniTask в редакторе появится новое окно UniTask Tracker, что позволяет посмотреть на UniTask'и что сейчас запущены.
Нужно помнить что UniTask нужно своевременно отменять используя CancellationToken иначе после уничтожения объекта или даже после выхода из игры обратно в редактор некоторые из задач будут по прежнему выполняться. Для этого можно использовать расширение:
var token = GetCancellationTokenOnDestroy();
Существующий код, что уже использует Coroutine или Task, может быть использован и далее, но уже через расширения UniTask:
SomeCoroutine().ToUniTask(cancellationToken: token);
SomeOtherCoroutine().WithCancellation(token);
SomeTask(token).AsUniTask();
Или же наоборот UniTask привести к Coroutine:
SomeUniTask(token).ToCoroutine();
Что почитать
Unity: 8 ошибок при использовании Async - Примеры кода которые можно встретить в настоящем проекте.