Coroutine đầu tiên của bạn
Thuộc phần Vật lý và lối chơi trong hành trình Unity của Coddy. Bài học 24 trên 71.
Update() phải hoàn tất trong mỗi khung hình, nên hàm này không thể chờ. Coroutine thì có thể: đây là một phương thức tạm dừng rồi tiếp tục sau đó, ngay tại chỗ nó đã dừng. Phương thức này trả về IEnumerator, cần có using System.Collections;, và mỗi câu lệnh yield return bên trong là một lần tạm dừng. Trong C#, yield return tạo ra một phương thức lần lượt cung cấp từng giá trị; Unity yêu cầu giá trị tiếp theo khi hết thời gian chờ. yield return null chờ một khung hình, còn yield return new WaitForSeconds(3f) chờ 3 giây.
StartCoroutine(Cycle()) bắt đầu một coroutine. Đèn giao thông này chuyển sang màu xanh, rồi màu vàng sau 3 giây và màu đỏ sau thêm một giây:
using System.Collections;
using UnityEngine;
public class TrafficLight : MonoBehaviour
{
Renderer lamp;
void Start()
{
lamp = GetComponent<Renderer>();
StartCoroutine(Cycle());
}
IEnumerator Cycle()
{
lamp.material.color = Color.green;
yield return new WaitForSeconds(3f);
lamp.material.color = Color.yellow;
yield return new WaitForSeconds(1f);
lamp.material.color = Color.red;
}
}StartCoroutine chạy coroutine đến câu lệnh yield đầu tiên ngay lập tức, rồi Start() tiếp tục; Unity tiếp tục chạy coroutine sau mỗi lần chờ, với các biến cục bộ giữ nguyên giá trị. Gọi riêng Cycle(); mà không có StartCoroutine thì không có tác dụng: lời gọi này tạo ra phương thức đang tạm dừng rồi bỏ nó đi, nên không có dòng nào trong phương thức chạy. Còn yield return 3f; không phải là lệnh chờ 3 giây: Unity chỉ nhận biết các đối tượng chờ như WaitForSeconds, còn mọi giá trị khác đều được xem là một khung hình.
Thử thách
DễHãy dùng coroutine để khiến bẫy gai bật lên khi nhấn phím Space.
- Viết
IEnumerator Spring(): ghi logClick,yield return new WaitForSeconds(0.5f);, sau đótransform.position += Vector3.up;. - Tiếp theo, chờ 2 giây theo cách tương tự rồi trừ
Vector3.upmột lần nữa. - Trong
ifkiểm tra phím Space, khởi chạy coroutine bằngStartCoroutine(Spring());.
Nhấn Play rồi nhấn Space: các gai bật lên, sau đó hạ xuống. Tiếp theo, nhấn Check.
Tự làm thử
using System.Collections;
using UnityEngine;
public class SpikeTrap : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// Kích hoạt bẫy bằng coroutine
}
}
// IEnumerator Spring(): Nhấp chuột, chờ 0.5 s, nâng lên 1 đơn vị, chờ 2 s, hạ xuống 1 đơn vị
}
Tất cả bài học trong Vật lý và lối chơi
1Rigidbody
Trọng lực và khối lượngĐẩy bằng AddForceNhảy bằng xung lựcFixedUpdate cho vật lýVận tốcVật thể động họcÔn tập: Bệ phóng4Coroutine
InvokeInvokeRepeating, CancelInvokeCoroutine đầu tiên của bạnVòng lặp trong CoroutineDừng CoroutineÔn tập: đếm ngược10Dự án: Thoát khỏi đấu trường
Đấu trườngThợ săn2Va chạm
OnCollisionEnterMình đã va chạm với gì?Vỡ khi va chạmĐứng trên mặt đấtĐộ nảy và ma sátHình dạng colliderÔn tập: Tường có thể phá vỡ5Dự án: Cuộc đua thu thập xu
Quả bóng lănThu thập xuTự luyện tập: Playground Unity