Menu
CoddyTech

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.

challenge icon

Thử thách

Dễ

Hãy dùng coroutine để khiến bẫy gai bật lên khi nhấn phím Space.

  1. Viết IEnumerator Spring(): ghi log Click, yield return new WaitForSeconds(0.5f);, sau đó transform.position += Vector3.up;.
  2. Tiếp theo, chờ 2 giây theo cách tương tự rồi trừ Vector3.up một lần nữa.
  3. Trong if kiểm tra phím Space, khởi chạy coroutine bằng StartCoroutine(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

Tự luyện tập: Playground Unity