1. Coroutine là gì?
Coroutine là một phương thức đặc biệt trong Unity cho phép bạn tạm dừng thực thi code và tiếp tục nó sau một khoảng thời gian. Nó rất hữu ích cho các tác vụ cần thời gian như animation, loading, hoặc thực hiện các hành động theo sequence.
2. Cách tạo và sử dụng Coroutine
Dưới đây là ví dụ cơ bản về cách tạo và sử dụng Coroutine:
using UnityEngine;
using System.Collections;
public class CoroutineExample : MonoBehaviour
{
void Start()
{
// Cách gọi một coroutine
StartCoroutine(SimpleCoroutine());
}
IEnumerator SimpleCoroutine()
{
Debug.Log("Bắt đầu coroutine");
yield return new WaitForSeconds(2f); // Đợi 2 giây
Debug.Log("Sau 2 giây");
}
}
3. Ví dụ thực tế: Di chuyển object
Ví dụ sau đây minh họa cách sử dụng Coroutine để di chuyển một object trong Unity:
public class MoveObject : MonoBehaviour
{
public float moveDistance = 5f;
public float duration = 2f;
void Start()
{
StartCoroutine(MoveOverTime());
}
IEnumerator MoveOverTime()
{
Vector3 startPosition = transform.position;
Vector3 endPosition = startPosition + Vector3.right * moveDistance;
float elapsedTime = 0f;
while (elapsedTime < duration)
{
elapsedTime += Time.deltaTime;
float progress = elapsedTime / duration;
transform.position = Vector3.Lerp(startPosition, endPosition, progress);
yield return null; // Đợi đến frame tiếp theo
}
transform.position = endPosition;
}
}
4. Các loại yield return phổ biến
Unity cung cấp nhiều loại yield return khác nhau cho các mục đích khác nhau:
yield return null
: Đợi đến frame tiếp theoyield return new WaitForSeconds(float)
: Đợi một khoảng thời gian cụ thểyield return new WaitForFixedUpdate()
: Đợi đến fixed update tiếp theoyield return new WaitUntil(() => condition)
: Đợi đến khi điều kiện thỏa mãn
5. Dừng Coroutine
Có hai cách để dừng Coroutine trong Unity:
void StopCoroutineExample()
{
// Dừng một coroutine cụ thể
StopCoroutine(MoveOverTime());
// Dừng tất cả coroutine
StopAllCoroutines();
}
Lưu ý quan trọng
- Coroutine chỉ chạy khi GameObject đang active
- Coroutine sẽ tự động dừng khi GameObject bị destroy
- Nên sử dụng StopCoroutine khi không cần thiết nữa để tối ưu hiệu năng