Menu
CoddyTech

InvokeRepeating, CancelInvoke

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 23 trên 71.

InvokeRepeating(nameof(Blink), 0.5f, 0.5f) gọi Blink lần đầu sau 0.5 giây, rồi gọi lại sau mỗi 0.5 giây cho đến khi bị hủy. Số thứ nhất là thời gian chờ trước lần gọi đầu tiên, số thứ hai là khoảng thời gian giữa các lần gọi. CancelInvoke(nameof(Blink)) dừng hàm này, còn CancelInvoke() không có tên sẽ dừng mọi Invoke mà tập lệnh đã lên lịch.

Đèn cảnh báo này nhấp nháy cho đến khi bạn nhấn Space, sau đó đèn sáng liên tục:

Light lamp;

void Start()
{
    lamp = GetComponent<Light>();
    InvokeRepeating(nameof(Blink), 0.5f, 0.5f);
}

void Blink()
{
    lamp.enabled = !lamp.enabled;
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        CancelInvoke(nameof(Blink));
        lamp.enabled = true;
    }
}

Bộ hẹn giờ trong chương về tạo vật thể cũng làm được việc tương tự bằng một trường float và một phép kiểm tra trong Update(). Với InvokeRepeating, Unity tự theo dõi thời gian và thực hiện các lần gọi. Bạn đặt lệnh gọi InvokeRepeating trong Start(): nếu đặt trong Update(), lệnh sẽ lên lịch thêm một lần gọi lặp lại ở mỗi khung hình.

challenge icon

Thử thách

Dễ

Khiến mạch nước phun trào ba lần theo lịch.

  1. Trong Start(), gọi InvokeRepeating(nameof(Erupt), 1f, 2f);.
  2. Viết void Erupt(): tăng eruptions thêm 1, gọi ball.AddForce(Vector3.up * power, ForceMode.Impulse); và ghi nhật ký "Eruption " + eruptions.
  3. Ở cuối Erupt(), khi eruptions == 3, gọi CancelInvoke(nameof(Erupt));.

Nhấn Chơi: quả bóng được phóng lên ba lần, cách nhau 2 giây. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public class Geyser : MonoBehaviour
{
    public Rigidbody ball;
    public float power = 6f;
    int eruptions;

    void Start()
    {
        // Phun trào sau khi nhấn Play 1 giây, rồi cứ 2 giây phun trào một lần
    }

    // Erupt(): đếm số lần phun trào, đẩy quả bóng lên và ghi nhật ký; dừng sau lần thứ ba
}

Tất cả bài học trong Vật lý và lối chơi

Tự luyện tập: Playground Unity