1. 程式人生 > >【Unity3d】設計自己的計時類

【Unity3d】設計自己的計時類

程式和遊戲中往往有很多需要計時的地方,比如很多日常任務是領取後倒計時到了就可以完成的。於是之前做遊戲的時候設計了一個計時類Timer,需要使用的時候例項化一個Timer,並且在Update中進行計時即可。
首先確定實現計時器需要哪些變數和功能。我們需要判斷計時器是否在工作,總的計時時長,當前的計時時長和計時的程序。我們還需要一些簡單的方法,如開始,暫停,恢復,停止等,當然在各個方法執行的時候能夠針對不同的情況相應一些事件也是必須的,不然這個計時器就不具備了通用性。知道了這些我們就可以開始設計我們的計時器了,其中計時器已秒為單位,我們可以進行更改定義自己需要的單位。
首先定義一些變數,這裡使用了Get和Set來設定屬性。

private bool _running;
private float _curTime;
private float _targetTime;
private float _process;

public float tartetTime
{
    get { return _targetTime; }
}

public float process
{
    get
    {
        return _process;
    }
    set
    {
        _process = Mathf.Clamp01(value);
        _curTime = _targetTime * _process;
    }
}

public
bool IsRunning() { return _running; }

然後我們用委託機制來實現我們需要自定義的事件。

public delegate void EventHandler();

// 計時器開始事件
public event EventHandler startEvent;
// 計時器計時事件
public event EventHandler tickEvent;
// 計時器結束事件
public event EventHandler endEvnet;
// 計時器暫停事件
public event EventHandler pauseEvent;
// 計時器停止事件
public event EventHandler stopEvent; // 計時器重置事件 public event EventHandler resetEvent;

當我們例項化一個Timer物件之後,只需新增對應的事件即可,當然是用+=時不要忘記在合適的事件對應地-=。

Timer timer = new Timer();

void OnEnable()
{
    timer.endEvent += OnTimerEnd;
}

void OnDisable()
{
    timer.endEvent -= OnTimerEnd;
}

void OnTimerEnd() 
{
    Debug.Log("Timer End");
}

當然我們例項化計時類的時候需要一個目標值,並且設定是否自動啟動計時器。當然我們也可以定義一些自己需要的內容,比如在特定的時間點處啟動等。程式碼如下:

public Timer(float target, bool autoStart)
{
    if (target < 0)
    {
#if UNITY_EDITOR
        Debug.Log("Target time must larger than 0");
#endif
        target = 0;
    }

    _targetTime = target;
    _curTime = 0;
    _process = 0;
    _running = autoStart;
}

最後就是控制計時器的一個方法,比如開始,暫停之類的,在每個方法中呼叫定義的委託事件。在呼叫之前需要先判斷一下是否有委託,不然會報錯。

public void TimerStart()
{
    _running = true;
    if (startEvent != null)
        startEvent();
}

public void TimerPause()
{
    _running = false;
    if (pauseEvent != null)
        pauseEvent();
}

public void TimerStop()
{
    _process = 0;
    _curTime = 0;
    _running = false;
    if (stopEvent != null)
        stopEvent();
}

public void TimerReset()
{
    _process = 0;
    _curTime = 0;
    _running = false;
    if (resetEvent != null)
        resetEvent();
}

public void ReStartTimer()
{
    _process = 0;
    _curTime = 0;
    _running = true;
    if (startEvent != null)
        startEvent();
}

最後也是最重要的一個函式,就是實現計時器計時功能的方法,這個方法需要在指令碼的Update中進行呼叫,或者在協程等一些可以計時的地方進行呼叫。我們給這個函式傳入一個float型別的時間間隔,讓計時器不斷更新當前時間,當進行到達1的時候計時就結束了。

public void TimerTick(float deltaTime)
{
    if (_running)
    {
        _curTime += deltaTime;
        _process = _curTime / _targetTime;
        if (tickEvent != null)
            tickEvent();

        if (_process >= 1)
        {
            _process = 1;
            _curTime = _targetTime;
            _running = false;
            if (endEvnet != null)
                endEvnet();
        }
    }
}

在我們需要使用計時器的指令碼中,建議先判斷計時器是否為null來避免我們刪除計時器後的報錯情況:

Timer timer = new Timer(60, true);

void Update()
{
    if(timer != null)
}

原始碼:
百度網盤
密碼:nvfg

by:蔣志傑

相關推薦

Unity3d設計自己計時

程式和遊戲中往往有很多需要計時的地方,比如很多日常任務是領取後倒計時到了就可以完成的。於是之前做遊戲的時候設計了一個計時類Timer,需要使用的時候例項化一個Timer,並且在Update中進行計時即可。 首先確定實現計時器需要哪些變數和功能。我們需要判斷計時

C++定義自己的String

我們自己寫的String類具有以下函式 1.建構函式 String(const char *s); //用c字串s初始化 String(int n,char c); //用n個字元c初始化 2.拷貝和賦值 String&am

C++設計一個

1、設計一個類,不能被繼承:    我們知道派生類在構造物件時,會先呼叫其基類的建構函式,然後再呼叫派生類的建構函式。所以,如果我們把基類的建構函式和解構函式設計為私有的,那麼派生類就不能呼叫基類的構造函數了,自然也就不能繼承了。但是這樣的話,這個基類也不能例項化了。我們可

cocos2d-x學習筆記建立自己的場景

本帖首發於自己新建的論壇網站:計算機專業學習網,www.hua2buxie.cn。有很多不懂,寫的也不好,望大家見諒!歡迎大家去我的網站發帖留言或者發教程。 背景:前段時間才開始學習cocos2d-x

程式碼K-means聚詳解及實現 (Matlab聚工具箱和自己實現)

一. 聚類 先說說聚類。顧名思義,就是有一團資料,根據某種準則把相似的資料分別聚在一起,形成不同的類別(每個類別稱為一簇)。聚類是一種無監督的演算法。所謂無監督就是說,雖然聚類把物體分類到了不同的簇,只能知道哪些資料是屬於同一類的,至於這一類資料到底是什麼,並不知道。

轉載設計模式_抽象工廠模式

ron mage ges 定義 ima cnblogs 工廠 一個 相互 定義:為創建一組相關或相互依賴的對象提供一個接口,而且無需指定他們的具體類。 是工廠方法的擴展。    【轉載】設計模式_抽象工廠模式

轉載設計模式_模板方法(學習)

res bootstrap 重載方法 dex col 算法實現 選擇性 parent abstract 模板方法模式,一般是為了統一子類的算法實現步驟,所使用的一種手段或者說是方式。它在父類中定義一系列算法的步驟,而將具體的實現都推遲到子類。 通常情況下,模板方法模式用

iOSUICollectionView自己定義Layout之蜂窩布局

with top http reserve src 布局 step object .com 網上的UICollectionView的Layout布局,其cell的形狀多為矩形和圓形。 本篇博文將正六邊形作為cell的基本形狀,為您展現獨特的蜂窩布局效果及實現源代碼。 幫

AndroidEclipse自己主動編譯NDK/JNI的三種方法

comm tro mman gnu tex android項目 syn color ng- 【Android】Eclipse自己主動編譯NDK/JNI的三種方法 SkySeraph Sep. 18th 2014 Email:[email protec

煩惱感覺自己跟不上時代的步伐了

智能 時代 bsp dba 人工 不出 公司 增刪 崗位 我的崗位是DBA,可是我感覺我的能力還是停留在數據的增刪查改上。這對於已經工作一年多的我來說無疑是悲哀的。 對於我們公司即將要上線的3.0, 我感覺壓力很大。怕做不出成績來。 想要提升,但是又覺得無從下手。 在這

約稿自己交一份年度總結——我的2014年

pos 我的2014 ora sans ext 經歷 簡單介紹 分享 part 主題:我的2014年(12月29日截稿) 一眨眼的功夫2014年就過去了。這一年對非常多人來說或許是不平靜的一年,或許是收獲的一年,或許是“黎明前黑暗”的一年

JAVA關於java中 .class.getResource("/").getPath()獲取路徑有空格的問題

() 獲取路徑 return url fig net java.net nbsp 相關信息 寫了一個web工程,在本地測試正確,但是部署到服務器上就出現錯誤。原因是讀取不到配置文件。 後來從打印出來的文件路徑中發現是用Java的class.getResource("/").

Python面向對象--的特殊成員方法

運行 turn 中一 new 返回值 析構 school pytho comm 類的特殊成員方法 1. __doc__  表示類的描述信息 class Func(object): ‘‘‘__doc__方法是用來打印類的描述信息‘‘‘ def te

Unity3D導出SpriteMode為Multiple時,裏面的每一張精靈圖片。

eight name 技術 directory 像素點 點擊 ref 菜單 分享 有時候,我們會需要把圖集中的每一個精靈導出來。 導出代碼:   [MenuItem("Tools/ExportSprite")] public static void Export

0002設計模式之原則

範圍 class 變化 chan reason 一件事 ever 模式 單一職責原則 【1】單一職責原則:   要求一個接口或者類只有一個原因引起變化;    也就是一個接口或者類只有一個職責,它負責一件事情;  There should never be more

鏈接偽(:hover)CSS背景圖片有閃動BUG

ref 重新 常用 底部 例如 ecc html 鏈接 cache 來源:http://www.css88.com/archives/744 -----------------------------------------------------------------

pythontime 和datetime型轉換,字符串型變量轉成日期型變量

-h with ptime 世紀 represent 字符串轉換 代碼 mes ear s1=‘20120125‘; 6 s2=‘20120216‘; 7 a=time.strptime(s1,‘%Y%m%d‘); 8 b=time.st

JavaScript設計模式-module模式及其改進

uid ... hello 代碼 first 其中 nbsp amp 初學者 寫在前面 編寫易於維護的代碼,其中最重要的方面就是能夠找到代碼中重復出現的主題並優化他們,這也是設計模式最有價值的地方 說到這裏...... 《head first設計模式》裏有一篇文章,是說使用

Muduo庫base一、Timestamp

second 一個 macro fin ftime mac cat gap base 一、Timestamp類 1、類圖如下: 2、 知識點 (1) 這個類繼承了 muduo::copyable, 以及 boost::less_than_comparable.

TipsUE總結自己常用的UltraEdit使用技巧

快捷方式 導致 體驗 什麽是 換行 描述 習慣 目標 恢復 如果您問我每天都要打開的軟件是什麽,那毫無疑問是UltraEdit!作為一位DBA,每天都要寫各種腳本,尤其是在對具有超多行行的大文件進行精心編輯時,沒有一個好的文本編輯器是不成的。掐指一算,哇塞,自己使用Ultr