UE4虛幻4引擎計時器Timer延遲方法

最近在做的游戲中經(jīng)常需要使用到定時器延遲贤惯。比如制作類似Moba游戲中的回城效果际跪,就會有一個幾秒鐘的延遲讀條宪睹。在標準的C/C++中我們可以用time庫函數(shù)比如Sleep來實現(xiàn)团搞,那么在Unreal中是怎么樣實現(xiàn)的呢绞旅?

1. C++

Unreal中有一個FTimerManager類專門實現(xiàn)與計時器相關(guān)的方法摆尝。官方的文檔可以看這里。其中我們發(fā)現(xiàn)了一個叫做SetTimer的函數(shù)因悲,這就是我們需要用的方法堕汞。

SetTimer函數(shù)有多個重載,常用的一個重載如下

    SetTimer(FTimerHandle& InOutHandle, UserClass* InObj, typename FTimerDelegate::TUObjectMethodDelegate< UserClass >::FMethodPtr InTimerMethod, float InRate, bool InbLoop = false, float InFirstDelay = -1.f)

這幾個參數(shù)的意義如下

FTimerHandle & InOutHandle : 計時器的句柄

UserClass* InObj : 執(zhí)行此方法的類晃琳,一般為this

FTimerDelegate::TUObjectMethodDelegate< UserClass >::FMethodPtr InTimerMethod : 計數(shù)器每次結(jié)束后要執(zhí)行的代理函數(shù)

float InRate : 每次計時器的時間長度

bool InbLoop : 是否循環(huán)

float InFirstDelay : 循環(huán)計時器第一次迭代的時間讯检, 若小于0.f則使用inRate

我們基本上比較關(guān)注的參數(shù)是中間的3個琐鲁,代理函數(shù), 循環(huán)計時的長度人灼,以及是否循環(huán)围段。其中代理函數(shù)尤為重要,在回城的例子中投放,我們需要在延遲5秒鐘之后調(diào)用傳送的方法將玩家傳送到指定的地點(在Moba中為基地)奈泪。這里我們就需要把傳送的方法放在代理函數(shù)中實現(xiàn)。如果不需要切換關(guān)卡的話就是簡單的重新設(shè)置player Pawn的位置和旋轉(zhuǎn)灸芳。即SetActorLocation以及SetActorRotation涝桅。或者這使用bool TeleportTo(const FVector & DestLocation, const FRotator & DestRotation, bool bIsATest, bool bNoCheck)烙样。 兩者之間的差異請自行查閱資料冯遂,簡單來說就是Set方法能夠直接改變玩家的位置和旋轉(zhuǎn),而TeleportTo方法會優(yōu)先檢查目的地點能否使用误阻,如果可以才將玩家移動過去。

C++實現(xiàn)延遲的核心思想基本就是這樣晴埂。但是有時候我們也想要在界面上顯示一個類似LOL回城的倒計時讀條究反。這樣的話可以結(jié)合C++和藍圖來實現(xiàn)相關(guān)的UI。

2. 藍圖實現(xiàn)倒計時條

在藍圖中實現(xiàn)倒計時讀條的核心實際上是需要通過增加一個變量來記錄當(dāng)前已經(jīng)經(jīng)過的時間或者是還剩下的時間長度儒洛。其中倒計時后開始傳送這個部分可以采用之前的C++方式來實現(xiàn)精耐,當(dāng)然亦可以使用完全一樣的藍圖類實現(xiàn)。

在藍圖當(dāng)中SetTimer函數(shù)叫做Set Timer By Function Name琅锻,參數(shù)基本和C++的SetTimer一樣卦停。要注意的是,在Function Name這里我們需要自己創(chuàng)建一個自定義的事件恼蓬。名字完全和Function Name所定義的一樣惊完。

SetTimerByFunctionName

右鍵選擇Add Custom Event, 取和FunctionName中一樣的名字处硬,在本例中為Teleport小槐,將需要的邏輯實現(xiàn),這部分主要調(diào)用了傳送的函數(shù)來實現(xiàn)5秒鐘后回城荷辕。

接下來就是最關(guān)鍵的倒計時顯示功能凿跳。首先我們需要在UIWidget設(shè)計部分引入進度條ProgressBar和一個Text來動態(tài)顯示已經(jīng)等待時間。

在ProgressBar的Percent中設(shè)置為1疮方,并且增減綁定變量控嗜。

ProgressBar binding

在左邊Variable欄定義一個新的float變量Countdown來記錄當(dāng)前經(jīng)過的時間。增加一個SetTimerByFunctionName節(jié)點骡显,設(shè)置為每0.1秒或者0.01秒(更加連貫)觸發(fā)疆栏。這個就用來更新進度條曾掂。

回城總流程
倒計時讀條刷新事件

每隔0.01秒就會調(diào)用這個CountDown事件,將變量CountDown增加0.01承边,并且當(dāng)變量到達5之后遭殉,表明讀條已經(jīng)結(jié)束,我們自動地用Clear Timer By Function Name節(jié)點把計時器清空博助,CountDown復(fù)原為0险污,為下一次回城的時候再次使用做初始化準備。

致此富岳,回城倒計時的邏輯就已經(jīng)實現(xiàn)了蛔糯,我們需要的只是把它顯示在主界面上就可以了。我們之前分別給ProgressBar和Text綁定了兩個函數(shù)窖式。這兩個函數(shù)就是用來返回我們需要顯示的值蚁飒。

打開ProgressBar綁定的GetParent_0的藍圖界面,我們需要返回的是百分比的數(shù)值萝喘,所以將CountDown變量除以總讀條時間5秒返回淮逻。這樣進度條就會根據(jù)百分比刷新。

計算進度條百分比

Text的顯示就更加簡單了阁簸,直接將CountDown由浮點型轉(zhuǎn)為Text輸出就完了爬早。我們的簡單的回城倒計時到此為止就完成了。Unreal的計時器還可以用來完成很多很有趣的功能启妹,計時器也是游戲中非常重要必不可少的一環(huán)筛严。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饶米,隨后出現(xiàn)的幾起案子桨啃,更是在濱河造成了極大的恐慌,老刑警劉巖檬输,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件照瘾,死亡現(xiàn)場離奇詭異,居然都是意外死亡丧慈,警方通過查閱死者的電腦和手機网杆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伊滋,“玉大人碳却,你說我怎么就攤上這事⌒ν” “怎么了昼浦?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長筒主。 經(jīng)常有香客問我关噪,道長鸟蟹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任使兔,我火速辦了婚禮建钥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘虐沥。我一直安慰自己熊经,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布欲险。 她就那樣靜靜地躺著镐依,像睡著了一般。 火紅的嫁衣襯著肌膚如雪天试。 梳的紋絲不亂的頭發(fā)上槐壳,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音喜每,去河邊找鬼务唐。 笑死,一個胖子當(dāng)著我的面吹牛带兜,可吹牛的內(nèi)容都是我干的枫笛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼鞋真,長吁一口氣:“原來是場噩夢啊……” “哼崇堰!你這毒婦竟也來了沃于?” 一聲冷哼從身側(cè)響起涩咖,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎繁莹,沒想到半個月后檩互,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡咨演,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年闸昨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薄风。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡饵较,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遭赂,到底是詐尸還是另有隱情循诉,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布撇他,位于F島的核電站茄猫,受9級特大地震影響狈蚤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜划纽,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一脆侮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧勇劣,春花似錦靖避、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至退敦,卻和暖如春粘咖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侈百。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工瓮下, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钝域。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓讽坏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親例证。 傳聞我的和親對象是個殘疾皇子路呜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,789評論 25 707
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料织咧? 從這篇文章中你...
    hw1212閱讀 12,699評論 2 59
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,092評論 1 32
  • 今天考試時胀葱,很多東西看著很熟悉,實際上并沒有掌握笙蒙。知識學(xué)習(xí)抵屿,需要反復(fù)復(fù)習(xí),但是我大學(xué)內(nèi)面的課程復(fù)習(xí)這點基本沒做到捅位。...
    夢夕夢閱讀 205評論 0 2
  • 一眼望不穿山 沒有紙的窗戶 遮不住漫天黃土 擋不住玉米地里的墳頭 一眼看不見水 沒有木頭的門 關(guān)不住一地的星 拌不...
    半蝦閱讀 301評論 4 7