Unity••15 min•254 views••
Coroutine, Async, UniTask & Đa luồng trong Unity/C#
Minh Khoa
Tác giả
1. Coroutine trong Unity
Định nghĩa
- Coroutine là cơ chế giả lập bất đồng bộ của Unity.
- Nó chạy trên main thread duy nhất của Unity (không phải đa luồng thật).
- Cho phép “tạm dừng” và “tiếp tục” code qua
yield return.
Cách hoạt động
- Coroutine là state machine do Unity quản lý.
- Mỗi frame, Unity “tick” coroutine → chạy tiếp từ chỗ
yield.
Ví dụ
IEnumerator FadeOut()
{
for (float t = 1; t > 0; t -= Time.deltaTime)
{
spriteRenderer.color = new Color(1,1,1,t);
yield return null; // tạm dừng tới frame sau
}
}
StartCoroutine(FadeOut());
Ưu điểm
- Đơn giản, dễ dùng cho animation, delay, sequence.
- Tích hợp sẵn vào vòng lặp Unity (frame, physics, WaitForSeconds…).
Nhược điểm
- Không đa luồng → không giảm tải CPU cho tác vụ nặng.
- Dễ bị “rò” nếu object bị destroy mà không StopCoroutine.
- Không return giá trị trực tiếp.
2. Async/Await trong C#
Định nghĩa
- Từ C# 5.0:
async/awaitcho phép viết code bất đồng bộ mà nhìn như đồng bộ. - Async không đồng nghĩa với đa luồng:
- Có thể chạy trên thread khác (Task.Run).
- Hoặc chỉ “đợi” I/O (không chặn main thread).
Ví dụ
public async Task LoadDataAsync()
{
string data = await File.ReadAllTextAsync("save.json");
Debug.Log(data);
}
Trong Unity
- Unity hỗ trợ C# async, nhưng không hook sẵn vào main loop → không await được
yield return. - Vì thế có library hỗ trợ (UniTask).
3. UniTask trong Unity
Định nghĩa
- UniTask là thư viện (Cysharp) giúp dùng async/await với Unity.
- Tích hợp await cho yield instruction (WaitForSeconds, AsyncOperation, …).
- Viết lại hệ thống
Taskcủa C# dưới dạng struct để không sinh ra rác (Zero Allocation), tối ưu tuyệt đối cho Unity. - Tối ưu lightweight hơn
---