UniTask: Allocation-free async/await for Unity
Zero-allocation async/await using structs and custom method builders.
Learn more about UniTask
UniTask is a high-performance asynchronous programming library for Unity that provides allocation-free async/await functionality through value-type task structures. It replaces the standard .NET Task-based model with custom struct-based implementations and specialized async method builders that avoid heap allocations during asynchronous operations. The library integrates directly with Unity's player loop system to schedule continuation callbacks without requiring additional thread synchronization or context switching overhead. It provides awaitable wrappers for Unity-specific operations such as frame delays, coroutine integration, and lifecycle events, enabling async patterns within Unity's single-threaded execution model. The zero-allocation design significantly reduces garbage collection pressure in performance-critical game scenarios where frequent asynchronous operations would otherwise cause memory churn.
Struct-based implementation
UniTask uses value types (structs) instead of reference types for task objects, combined with custom AsyncMethodBuilder to eliminate heap allocations during async/await operations. This reduces garbage collection pressure compared to standard Task-based approaches.
PlayerLoop integration
Operations execute within Unity's PlayerLoop system rather than on background threads, ensuring compatibility with single-threaded platforms like WebGL and wasm. This design allows frame-based timing and synchronization with Unity's lifecycle events.
Awaitable Unity APIs
The library wraps Unity's AsyncOperations, coroutines, and UI events as awaitable objects, allowing them to be used directly with async/await syntax. It also provides PlayerLoop-based alternatives to coroutine operations like WaitForSeconds and yield return null.
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
public class BasicUniTaskExample : MonoBehaviour
{
async UniTask<string> LoadAssetsAsync()
{
// Await Unity's AsyncObject operations
var asset = await Resources.LoadAsync<TextAsset>("config");
// Await web requests
var webRequest = UnityWebRequest.Get("https://api.example.com/data");
var response = await webRequest.SendWebRequest();
string jsonData = response.downloadHandler.text;
// Load scenes asynchronously
await SceneManager.LoadSceneAsync("GameScene");
return jsonData;
}
}See how people are using UniTask
Top in Developer Tools
Related Repositories
Discover similar tools and frameworks used by developers
Doom Emacs
Modular framework with lazy loading and vim keybindings.
Git
Snapshot-based version control with distributed repository architecture.
n
A command-line utility for installing, switching between, and managing multiple Node.js versions on Unix-like systems.
tqdm
Instrument Python iterables with minimal-overhead progress tracking.
Grbl
Real-time motion control firmware for Arduino-based CNCs.