nullreference.dev

Unity. Переходим на UniTask

Jun 2025

UniTask - это легковесная версия 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'и что сейчас запущены.

a

Нужно помнить что UniTask нужно своевременно отменять используя CancellationToken иначе после уничтожения объекта или даже после выхода из игры обратно в редактор некоторые из задач будут по прежнему выполняться. Для этого можно использовать расширение:

var token = GetCancellationTokenOnDestroy();

Существующий код, что уже использует Coroutine или Task, может быть использован и далее, но уже через расширения UniTask:

SomeCoroutine().ToUniTask(cancellationToken: token);
SomeOtherCoroutine().WithCancellation(token);
SomeTask(token).AsUniTask();

Или же наоборот UniTask привести к Coroutine:

SomeUniTask(token).ToCoroutine();

Что почитать

[ back to home ]