使用 Time.deltaTime 計時

由於 Time.deltaTime 為每個 Update 的秒差,所以我們可以通過不停加總 Time.deltaTime 取得目前經過的時間,用此特性可以做一個簡易的計時器。

每3秒觸發一次

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    private float passedTime = 0; // 用來累加時間的變數
    private float timerInterval = 3; // 設定觸發間隔

    void Start()
    {
        
    }

    void Update()
    {
        // 每次都累加經過的時間
        passedTime += Time.deltaTime;

        // 當經過時間已經超過觸發間隔
        if (passedTime >= timerInterval)
        {
            // 執行要觸發的內容.....


            // 把經過時間歸零(為了讓之後還會反覆觸發)
            passedTime = 0;
        }
    }
}

TIP

雖然此方法較簡單,但缺點也很明顯,會讓程式碼變得複雜許多、較不直觀。所以計時器相關的功能,建議盡量使用 Coroutine (協程)

停1秒後只觸發一次

很多情況裡,是某些動作得延遲幾秒再執行。

例如:敵人死亡後要播放1秒動畫後,才掉落物品。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Emeny : MonoBehaviour
{

    private bool isDead = false; // 是否死亡
    private float deadDelay = 1.5; // 設定延遲計時秒數
    private float deadDelayTimer = 0; // 用來累加時間的變數

    void Start()
    {
        
    }

    void Update()
    {
        // 活著的時候
        if (!isDead)
        {
            // ......
        }

        // 當設為死亡時
        if (isDead)
        {
            // 開始計時,當超過 1.5 秒後
            deadDelayTimer += Time.deltaTime;
            if (deadDelayTimer >= deadDelay)
            {
                // 刪除物件
                gameObject.SetActive(false);
                Destory(gameObject);

                // 觸發其他需要在1秒延遲後執行的行為 (例如:產生掉落物、結算在場怪物數量)
                // ......
            }
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        // 當碰到子彈就設為死亡
        if (other.tag == "Bullet")
        {
            // 觸發要立即執行的行為 (例如:播放死亡動畫、添加死亡效果)
            // ......

            // 設為死亡
            isDead = true;
        }
    }
}

Last Updated:
Contributors: Vincent Chen