close

有2種方法...

第1種:使用Unity提供的StartCoroutine搭配yield return,詳情請看這篇文章

第2種:使用C#提供的Threading.Timer,同這篇作法

P.S.其實還有一種,使用FiexdUpdate()和Time.fixedDeltaTime,但是會受到Time.timeScale影響

 

一樣建立一個C# script,命名為Test,開始撰寫程式碼~~(scrips都放在Camera上~~)

第1種方法:


using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
    private bool timerLock = false;//防止計時器計時到之前被呼叫
    private int count = 0;

    private void Update ()
    {
        if(timerLock == false)
        {
            Debug.Log(count);
            StartCoroutine(delay(1f));//延遲1秒
        }
    }

    private IEnumerator delay(float time)
    {
        timerLock = true;
        yield return new WaitForSeconds(time);
        count++;
        timerLock = false;
    }
}


 

第2種方法:


using UnityEngine;
using System.Collections;
using System.Threading;

public class Test : MonoBehaviour
{
    private bool timerLock = false;//防止計時器更新count數值前被重複顯示
    private int count = 0;

    private void Start()
    {
        //建立TimerCallback物件,並設定當計時到時要執行的函數
        TimerCallback callback = new TimerCallback(Task);

        //建立Timer物件,第一個參數為TimerCallback,第二個參數表示要傳給callback的物件
        //第三個參數代表要多久之後執行(延遲啟動),第四個參數代表每隔多久執行一次(延遲時間)
        //該物件一旦產生就立刻計時了!

        Timer timer = new Timer(callback, null, 1000, 1000);

        //可以使用以下的方式重新設定延遲啟動和延遲時間
        //timer.Change(2000, 2000);
        
        //下面這行的作用為停止計時
        //timer.Dispose();

        timerLock = true;
    }

    private void Update ()
    {
        if(timerLock == false)
        {
            Debug.Log(count);
            timerLock = true;
        }
    }

    //TimerCallback函數使用委派的方式達成,所以傳入和傳出的參數有固定格式
    private void Task(object obj)
    {
        count++;
        timerLock = false;
    }
}


 

arrow
arrow
    全站熱搜

    Yang 發表在 痞客邦 留言(0) 人氣()