藍(lán)圖節(jié)點(diǎn)基礎(chǔ)知識(shí)Nodes - 虛幻引擎

The Basics Of Nodes In Unreal Engine 4/5
原作者:Matt Aspland??本文為英文視頻教程整合的中文筆記,旨在快速了解藍(lán)圖常用的節(jié)點(diǎn),為使用引擎打下堅(jiān)實(shí)的基礎(chǔ)
1. Flip Flop 觸發(fā)器
打開關(guān)閉某種功能
切換狀態(tài)。
通常用途:
角色切換沖刺或普通運(yùn)動(dòng)狀態(tài)。
蹲下或站立狀態(tài)

2. Lerp 插值
Lerp的全稱是Linear Interpolation? 線性插值
本質(zhì)上根據(jù)alpha值設(shè)置或者更改值
應(yīng)用范例:使用一個(gè)timeline來執(zhí)行開門。
時(shí)間線的軌道將使用lerp的alpha值,并且得到一個(gè)打開和關(guān)閉的位置和角度。
然而當(dāng)你想要打開它進(jìn)入a和b之間的的角度,這意味著隨著timeline的進(jìn)度,它將使用alpha值來找到a和b之間的開關(guān)位置。軌跡是從0到1,當(dāng)alpha值是0.5的時(shí)候,門將是半開或半關(guān)。
?

3. Do Once
這個(gè)節(jié)點(diǎn)之后的所有代碼只執(zhí)行一次。
就算在Event Tick里它也只會(huì)執(zhí)行一次所有的操作,直到你重置它。
比如鬼屋里只能打開一次的門,進(jìn)屋后,門就一直關(guān)閉不能反復(fù)開關(guān)了。

這是一個(gè)可以反復(fù)開關(guān)的門

在出口添加Do Once節(jié)點(diǎn),然后再播放動(dòng)畫,這樣門只能打開一次。
可以使用Reset入口來控制它的重置。但是Reset不會(huì)重置動(dòng)畫。

4. Switch On Int 切換整型
根據(jù)某個(gè)數(shù)值觸發(fā)一行代碼

類似于其他語言的Switch...case語句
5. Sequence 序列
從一個(gè)事件觸發(fā)多行代碼
例如:從一個(gè)Event Tick來觸發(fā)耐力系統(tǒng),通過序列來獲得多個(gè)執(zhí)行的代碼行(háng)。

它可以按序列同時(shí)執(zhí)行,不用等第一個(gè)序列執(zhí)行完再走到第二個(gè)序列。每個(gè)序列都是獨(dú)立的代碼行相互不干擾。
6.Cast to 類型轉(zhuǎn)換
主要應(yīng)用于不同藍(lán)圖之間的調(diào)用,選擇正確的對(duì)象并轉(zhuǎn)換為相應(yīng)的類,從而調(diào)用該對(duì)象中的屬性。
角色藍(lán)圖 (Pawn也是類似的用法)

是從一個(gè)藍(lán)圖投射到另一個(gè)藍(lán)圖的實(shí)際應(yīng)用方法。
關(guān)卡藍(lán)圖調(diào)用角色藍(lán)圖

7.Branch 分支
程序里的If....Else...
檢查布爾變量的值,如果為真則觸發(fā)真分支的代碼如果為假則觸發(fā)假分支的代碼。

8.For循環(huán)
在循環(huán)體中觸發(fā)從第一個(gè)到最后一個(gè)索引之間的代碼,然后觸發(fā)代碼的執(zhí)行內(nèi)容并無限期的重復(fù)這個(gè)操作,除非被告知僅執(zhí)行一次,或一定的次數(shù)。如果想要停止的話可以用帶Break的For循環(huán)

循環(huán)體是你希望在循環(huán)內(nèi)執(zhí)行的代碼行,第一個(gè)和最后一個(gè)索引是你希望循環(huán)執(zhí)行的次數(shù)。
Completed是你希望在循環(huán)結(jié)束后執(zhí)行的代碼行
9. Begin & End Overlap 開始/結(jié)束重疊
開始重疊和結(jié)束重疊 將沿著執(zhí)行行觸發(fā)一個(gè)脈沖,這對(duì)于打開特定區(qū)域的門很有用。
在一個(gè)門的前面但不是特別遠(yuǎn)的時(shí)候可以使用重疊事件。
TriggerBox的Overlapped Actor是你需要忽略的行動(dòng)對(duì)象,比如你不希望AI角色進(jìn)行操作,只希望自己操作的角色來觸發(fā)重疊。就可以把AI角色放在這里。Other Actor是你可以用來進(jìn)行重疊操作的行動(dòng)對(duì)象。


10. Gate 門
?門可以讓你開關(guān)來控制執(zhí)行流程。
?想象一個(gè)真實(shí)世界開關(guān)門的流程,開->進(jìn)入->走出->關(guān)
?在開->關(guān)后是無法進(jìn)入的
?![[Pasted image 20230708025928.png]]
?進(jìn)入門的碰撞領(lǐng)域 觸發(fā)Open 然后按E 觸發(fā)進(jìn)入Enter,離開碰撞領(lǐng)域 觸發(fā)Close。Exit可以觸發(fā)開門的所有后續(xù)操作代碼(Enter后)。
?而Toggle錨點(diǎn)屬于用同一個(gè)事件來控制開關(guān)。
11.Do N 執(zhí)行N次
類似于Do Once ,但是可以指定執(zhí)行次數(shù)。

圖中展示一個(gè)最大行走速度逐漸增加的過程,在停止移動(dòng)后重置。在開始行動(dòng)后遞增速度每次15,遞增50次(除非中斷行走)
12. Custom Event 自定義事件
在藍(lán)圖中可以自己創(chuàng)建的事件,觸發(fā)或者調(diào)用代碼比如一個(gè)宏或者一個(gè)函數(shù)。
一般代碼的起始就是從一個(gè)事件觸發(fā),你需要從其他的東西觸發(fā)它然后觸發(fā)事件,從而運(yùn)行后續(xù)的代碼。
為什么不直接使用宏或者函數(shù)開始呢?因?yàn)槭录梢圆恍枰咨膱?zhí)行線來引用,它可以被重復(fù)調(diào)用多次,這樣不會(huì)造成代碼的混亂。它的作用跟宏和函數(shù)是類似的,但是可以應(yīng)用到更復(fù)雜和細(xì)節(jié)的代碼中,把代碼寫入事件,再調(diào)用事件。

一個(gè)飛行機(jī)制模式切換的自定義事件,參數(shù)可以自定義

使用按鍵即可調(diào)用事件
在任何時(shí)間,任何地方都可以調(diào)用自定義事件,在關(guān)卡藍(lán)圖也可以調(diào)用角色藍(lán)圖的自定義事件。
13. Print String 打印字符串
用來測(cè)試和Debug,在打包好的游戲或?qū)С龅挠螒蚴遣贿m用的。只在引擎內(nèi)部使用。
它會(huì)顯示在視口的左上角。在實(shí)現(xiàn)UI界面之前,可以輸出一些數(shù)據(jù)比如體力,生命值,來確認(rèn)你的代碼是否工作正常。

一個(gè)生命值遞減的打印顯示,在最后生命值小于0的時(shí)候打印出角色死亡
14. Variables 變量
Integer 整型
淡青綠色 完整的數(shù)字
Float 浮點(diǎn)型
草綠色 實(shí)數(shù),雙精度,如果需要更高精度的數(shù)字則需要用到
Text 文本
淡粉紫色 一般用來寫在名稱
String 字符串
玫紅色? 字符和數(shù)字的集合,用來表示句子
Vector 向量
淡金黃色 使用3個(gè)數(shù)字來表示3D坐標(biāo)的位置。x y z
Rotator 旋轉(zhuǎn)體
淡藍(lán)紫色 也是使用3個(gè)數(shù)字來表示旋轉(zhuǎn)位置 x y z
Transform 變換
橙色 可以用在旋轉(zhuǎn),位置,大小的變量上,三個(gè)值存在它一個(gè)上面
Object 對(duì)象
淺藍(lán)色 對(duì)屬性的引用,可以是光源,靜態(tài)網(wǎng)格體或者聲音盒子
15. Get All Actors Of Class 獲取類的所有Actor
可以用這個(gè)節(jié)點(diǎn)來更新關(guān)卡中當(dāng)前Actor的數(shù)量和類型,它可以放在GameMode里。每個(gè)target在創(chuàng)建或者銷毀的時(shí)候都可以調(diào)用這個(gè)節(jié)點(diǎn)。
這是一個(gè)效率較低的節(jié)點(diǎn),雖然它是一個(gè)獲取對(duì)象的通配符,使用它的話會(huì)遍歷當(dāng)前關(guān)卡的所有Actor。 不僅僅是你想要轉(zhuǎn)換的Actor。這樣會(huì)導(dǎo)致代碼變得緩慢。不要在每幀使用它,可以在事件開始運(yùn)行(Event BeginPlay)或者自定義事件(Custom Event)使用它,觸發(fā)一次。
但是不要太頻繁的使用它。
它基本就是一個(gè)Cast to,但是它返回指定這個(gè)類別的任何藍(lán)圖Actor的數(shù)組。
另外還需要使用索引編號(hào)取出單個(gè)的Actor,獲得一個(gè)副本,然后再訪問它以下的內(nèi)容。

如果不需要獲得類中的所有Actor可以使用Cast To來代替,因?yàn)槟憧赡芤残枰玫紼vent Tick來快速執(zhí)行操作,每次獲取類的所有Actor時(shí),可能就不夠快。
16. Blend Poses By Bool 按布爾混合姿勢(shì)
動(dòng)畫藍(lán)圖中的節(jié)點(diǎn)
通過一個(gè)布爾值混合兩個(gè)姿勢(shì)。

范例:在狀態(tài)機(jī)根據(jù)布爾值來確定不同狀態(tài)下的姿勢(shì),槍械是否裝備,條件為真使用帶槍姿勢(shì),條件為假使用普通姿勢(shì)。Blend Time代表姿勢(shì)變換需要的過渡時(shí)間。
在動(dòng)畫藍(lán)圖的事件圖表里設(shè)置好布爾值

在角色藍(lán)圖中的事件圖表設(shè)置觸發(fā)切換布爾值模式的代碼

這是快速有效的設(shè)置多個(gè)動(dòng)畫的方法。可以只寫一個(gè)狀態(tài)機(jī),但在不同的混合空間或者動(dòng)畫之間切換狀態(tài)。
17.Event Dispatcher 事件分發(fā)器
范例:從玩家藍(lán)圖觸發(fā)關(guān)卡藍(lán)圖中的事件,正常來講 無法在玩家藍(lán)圖投射關(guān)卡藍(lán)圖。

在玩家藍(lán)圖中創(chuàng)建事件分發(fā)器。使用事件分發(fā)器來傳遞變量,這樣可以根據(jù)等級(jí)的數(shù)值的變動(dòng)來改變關(guān)卡藍(lán)圖。

使用Call來調(diào)用這個(gè)事件分發(fā)器,并把參數(shù)Level設(shè)定好傳入。在調(diào)用的時(shí)候?qū)嶋H上是在整個(gè)游戲中將消息廣播到偵聽此事件的任何其他藍(lán)圖。
在關(guān)卡藍(lán)圖偵聽事件并執(zhí)行后續(xù)的代碼。

在關(guān)卡藍(lán)圖投射玩家藍(lán)圖并綁定這個(gè)事件分發(fā)器,從Event事件創(chuàng)建一個(gè)新的自定義事件,這時(shí)候可以調(diào)用Level這個(gè)變量。

在自定義事件后使用變量作為觸發(fā)條件來執(zhí)行后續(xù)的代碼。
事件分發(fā)器是一種很有效的調(diào)度方式,尤其是一次多個(gè)事件。因?yàn)樵谡{(diào)度程序時(shí)它會(huì)同時(shí)觸發(fā)所有綁定到它的事件。并且我們可以通過它傳遞變量。比如通常無法投射到的關(guān)卡藍(lán)圖。
藍(lán)圖接口只是做了一些與事件分發(fā)器略有不同的事情,它更多用于觸發(fā)事件,而藍(lán)圖接口更純粹地用于通信和觸發(fā)函數(shù),而不是事件。
18.Event Tick 事件Tick
事件Tick是個(gè)需要小心使用的事件,因?yàn)槿绻褂貌徽_它可能會(huì)導(dǎo)致游戲反應(yīng)滯后。
它會(huì)在每個(gè)Tick的時(shí)間觸發(fā),一個(gè)Tick是一幀,如果每秒60幀的速度運(yùn)行,那就會(huì)每秒運(yùn)行60Tick次。
事件Tick會(huì)觸發(fā)相當(dāng)多的次數(shù),它將歸檔每一幀,每秒144幀會(huì)使事件一秒觸發(fā)144次。它的運(yùn)行效能取決于你的電腦。如果用的太多或者使用錯(cuò)誤,對(duì)電腦的性能要求可能會(huì)很高。
一個(gè)很好的替代方案是使用自定義事件,因?yàn)楹芏嗳耸褂檬录ick來查找值。
如果一個(gè)生命值低于一個(gè)確定的值,那么可以創(chuàng)建一個(gè)自定義事件,然后當(dāng)收到傷害時(shí)再去檢查生命值。這樣就不需要一直檢查它,而只是需要的時(shí)候再檢查。
請(qǐng)確保正確使用Event Tick而不是過度的使用。

如果打印Delta Seconds會(huì)得到滿屏的延遲秒數(shù),大約在0.01左右,這取決于PC效率,有些電腦有更好的幀效率那么這個(gè)數(shù)字就會(huì)小一些。Delta Seconds是每次調(diào)用事件的間隔時(shí)間。如果想做一些依賴于幀速率的事情,無論有多少幀,這都是很好的選擇,這段代碼始終與系統(tǒng)的幀同步,并且結(jié)果始終相同。高FPS的話會(huì)有低Delta Seconds,低FPS會(huì)有高Delta Seconds。
代碼將根據(jù)幀速率在上下文中運(yùn)行。你可以在這個(gè)事件寫任何東西,它只是一直在觸發(fā)。
如果使用它查看生命值,之前說的是可以在自定義事件中實(shí)現(xiàn),按需啟動(dòng)。
但還是可以利用它進(jìn)行移動(dòng)輸入,然后使用Delta Seconds作為比例值,這樣無論幀率是多少,最終得到相同的移動(dòng)結(jié)果。

在轉(zhuǎn)向的時(shí)候獲取Delta Seconds 這樣可以確保幀速率與相機(jī)的轉(zhuǎn)向速率的同步。

Event Tick無法同時(shí)關(guān)聯(lián)兩個(gè)Branch分支節(jié)點(diǎn),我們使用序列Sequence來連接后續(xù)的代碼。
這樣可以同時(shí)觸發(fā)多個(gè)代碼。

19.Clamp限制
夾子:它限制另外兩個(gè)值之間的值。防止它高于或者低于某些值。如果需要精確的數(shù)字并且不需要手動(dòng)設(shè)置。比如檢查生命值是否超過100,如果超過了就將其重置回100,它可以自動(dòng)執(zhí)行這樣的操作。

Clamp節(jié)點(diǎn)將確保Health在最小值0.0和最大值100.0的區(qū)間內(nèi)輸出。
同理關(guān)于整數(shù),向量,角度等等都是同樣的方式。