UE5-藍(lán)圖通信 :接口/事件分發(fā)器/引用

開(kāi)篇先導(dǎo):

#1 為什么要用反射?
????#1.1?藍(lán)圖可編輯實(shí)例
????#1.2?序列化和反序列化
????#1.3?游戲狀態(tài)保存和恢復(fù)
#2 4類常見(jiàn)通信方式
#3? 藍(lán)圖接口 (BluePrint Interface)
#4 事件分發(fā)器(Event Dispatch)
#5?使用區(qū)別和注意事項(xiàng)
#1:為什么要用反射

? ??當(dāng)我們?cè)谑褂?Unreal Engine 5(UE5)進(jìn)行游戲開(kāi)發(fā)時(shí),經(jīng)常需要在游戲運(yùn)行時(shí)處理大量的對(duì)象{object)以及他自個(gè)的屬性。這些對(duì)象和屬性可能來(lái)自于游戲場(chǎng)景的一個(gè)“box獎(jiǎng)勵(lì)箱”、角色(血量,buff)、物品(效果)等各種元素。在處理這些對(duì)象和屬性時(shí),我們便需要使用到UE5為我們提供的反射機(jī)制。
藍(lán)圖接口,和事件分發(fā)器,這兩個(gè)功能,他們都離不開(kāi)UE的反射,沒(méi)有反射,這一切的一切都無(wú)法實(shí)現(xiàn)。他們都是基于這個(gè)地基之上的高樓。
反射是指在運(yùn)行時(shí)獲取一個(gè)對(duì)象的類型和屬性信息,然后使用這些信息來(lái)執(zhí)行操作。也就是,運(yùn)行時(shí)類型信息可用。
在 UE5 中,反射是通過(guò)使用 UClass、UObject 和 UProperty 等類來(lái)實(shí)現(xiàn)的。想了解最底層,可以去知乎看ue社區(qū)經(jīng)理,大釗的專欄。
下面說(shuō)下反射在 UE5?中的一些常見(jiàn)應(yīng)用場(chǎng)景。
1.1 藍(lán)圖可編輯實(shí)例(Instance Editable)
? ?藍(lán)圖可編輯(Instance Editable)實(shí)例,允許開(kāi)發(fā)者(你)在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建和編輯類的實(shí)例。在創(chuàng)建實(shí)例時(shí),UE5反射系統(tǒng)會(huì)使用元數(shù)據(jù)來(lái)初始化實(shí)例的屬性。開(kāi)發(fā)者可以使用 細(xì)節(jié)(Details) 面板來(lái)編輯類的屬性,并使用 事件面板圖表(就是藍(lán)圖編輯器界面)來(lái)定義類的行為。這樣,開(kāi)發(fā)者就可以通過(guò)藍(lán)圖來(lái)創(chuàng)建和編輯對(duì)象,而不需要編寫 C++ 代碼。
?1.2 序列化和反序列化
????序列化是指將對(duì)象轉(zhuǎn)換為一系列二進(jìn)制數(shù)據(jù)(因?yàn)閏pu只認(rèn)二進(jìn)制)的過(guò)程,而反序列化是指將這些二進(jìn)制數(shù)據(jù)轉(zhuǎn)換回對(duì)象的過(guò)程。在序列化和反序列化過(guò)程中,反射可以幫助我們動(dòng)態(tài)地獲取對(duì)象的屬性信息,并將其轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)或者將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換回對(duì)象。
1.3 游戲狀態(tài)保存和恢復(fù)
????在游戲運(yùn)行的時(shí)候,有時(shí)候我們需要保存和恢復(fù)游戲的狀態(tài)(存檔讀檔)。這個(gè)時(shí)候反射也可以派上用場(chǎng)。我們可以使用反射來(lái)獲取游戲對(duì)象的屬性值,并將其保存為一系列數(shù)據(jù)。當(dāng)需要恢復(fù)游戲狀態(tài)時(shí),我們可以使用這些數(shù)據(jù)來(lái)重新創(chuàng)建游戲?qū)ο?,并將其屬性值設(shè)置為之前保存的值。
1.4 具體來(lái)說(shuō)
????藍(lán)圖可編輯實(shí)例使用了 UE5 的這套反射系統(tǒng),通過(guò)對(duì)對(duì)象屬性進(jìn)行元數(shù)據(jù)標(biāo)注,在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建類的實(shí)例。反射系統(tǒng)會(huì)讀取類的元數(shù)據(jù),包括屬性名稱、類型、默認(rèn)值等信息,然后將其用于創(chuàng)建實(shí)例。
在創(chuàng)建實(shí)例時(shí),反射系統(tǒng)會(huì)使用元數(shù)據(jù)來(lái)初始化實(shí)例的屬性。

#2? 4類常見(jiàn)通信方式
2.1 直接通信 對(duì)象引用


2.2 類型轉(zhuǎn)換

2.3 藍(lán)圖接口(Blueprint Interface)

2.4?事件分發(fā)器(EventDispatcher)

還有一個(gè)是關(guān)卡藍(lán)圖,獲取對(duì)象引用來(lái)控制actor,一般不常用。

#3? 藍(lán)圖接口 (BluePrint Interface)

在UE5中藍(lán)圖接口和事件分發(fā)器。
????是咱們常用的兩種藍(lán)圖通信機(jī)制,它們都可以用于不同藍(lán)圖之間的通信(比如開(kāi)關(guān)button對(duì)象和燈泡(light)對(duì)象,進(jìn)行通信)。
本文我們將介紹藍(lán)圖接口和事件分發(fā)器的使用區(qū)別、注意事項(xiàng)和使用場(chǎng)景。

1 使用方法:
藍(lán)圖接口可以在一個(gè)藍(lán)圖中定義一個(gè)接口方法,并在其他藍(lán)圖中實(shí)現(xiàn)該接口方法。使用藍(lán)圖接口,需要注意以下幾點(diǎn):
① 接口方法必須在接口中定義,并且必須有輸入和輸出參數(shù)。

② 接口必須在藍(lán)圖中被實(shí)現(xiàn),否則在調(diào)用該接口時(shí)會(huì)拋出錯(cuò)誤。

③ 一個(gè)藍(lán)圖可以實(shí)現(xiàn)多個(gè)接口,也可以實(shí)現(xiàn)同一個(gè)接口的多個(gè)版本。
④ 藍(lán)圖接口只能在藍(lán)圖之間傳遞數(shù)據(jù)和消息,不能直接調(diào)用函數(shù)或方法。

使用場(chǎng)景
藍(lán)圖接口通常用于以下場(chǎng)景:
① 當(dāng)多個(gè)藍(lán)圖需要共享相同的邏輯或數(shù)據(jù)時(shí),可以通過(guò)定義一個(gè)藍(lán)圖接口,在多個(gè)藍(lán)圖中實(shí)現(xiàn)該接口,從而實(shí)現(xiàn)數(shù)據(jù)或消息的共享。
② 當(dāng)需要修改或擴(kuò)展一個(gè)藍(lán)圖的功能時(shí),可以通過(guò)定義一個(gè)新的接口,并在原有藍(lán)圖中實(shí)現(xiàn)該接口,從而實(shí)現(xiàn)功能的擴(kuò)展。
注意事項(xiàng):
藍(lán)圖接口只能在藍(lán)圖內(nèi)部使用,不能被C++代碼調(diào)用。
如果一個(gè)藍(lán)圖實(shí)現(xiàn)了一個(gè)藍(lán)圖接口,但沒(méi)有實(shí)現(xiàn)接口中定義的所有函數(shù),那么在編譯時(shí)會(huì)產(chǎn)生警告。
如果多個(gè)藍(lán)圖實(shí)現(xiàn)了同一個(gè)藍(lán)圖接口,那么在使用接口時(shí)需要注意具體調(diào)用哪個(gè)實(shí)現(xiàn)。
#4 事件分發(fā)器(Event Dispatch)
在這種方法中,負(fù)責(zé)發(fā)送事件的Actor需要?jiǎng)?chuàng)建一個(gè)?事件分發(fā)器(Event Dispatcher)

所有監(jiān)聽(tīng)該事件的Actor都會(huì)訂閱該事件分發(fā)器。

此通信方法采用一對(duì)多關(guān)系,每當(dāng)當(dāng)前Actor觸發(fā)事件分發(fā)器后,監(jiān)聽(tīng)該Actor的其他Actor都會(huì)收到通知。
????4.1使用方法
事件分發(fā)器(Event Dispatch)是一種通用的消息傳遞機(jī)制,它可以在一個(gè)藍(lán)圖中定義一個(gè)事件,并在其他藍(lán)圖中調(diào)用該事件。使用事件分發(fā)器,需要注意以下幾點(diǎn):
① 事件必須在藍(lán)圖中定義。
② 事件分發(fā)器可以在任何藍(lán)圖中調(diào)用,可以是同一藍(lán)圖中的其他事件,也可以是不同藍(lán)圖之間的事件。
③ 事件分發(fā)器可以通過(guò)調(diào)用多個(gè)不同的事件實(shí)現(xiàn)對(duì)同一消息的廣播。
④ 事件分發(fā)器可以在藍(lán)圖之間傳遞消息和數(shù)據(jù),也可以調(diào)用其他藍(lán)圖中的函數(shù)或方法。
4.2使用場(chǎng)景
事件分發(fā)器通常用于以下場(chǎng)景:
當(dāng)需要在多個(gè)藍(lán)圖中實(shí)現(xiàn)相同的功能時(shí),可以通過(guò)定義一個(gè)事件,在多個(gè)藍(lán)圖中調(diào)用該事件,從而實(shí)現(xiàn)數(shù)據(jù)或消息的共享。
?當(dāng)需要廣播消息時(shí),可以通過(guò)調(diào)用事件分發(fā)器實(shí)現(xiàn)消息的廣播。
?當(dāng)需要調(diào)用其他藍(lán)圖中的函數(shù)或方法時(shí),可以通過(guò)調(diào)用事件分發(fā)器實(shí)現(xiàn)對(duì)其他藍(lán)圖的調(diào)用。
注意事項(xiàng):
事件分發(fā)器是一種異步機(jī)制,事件發(fā)送方和接收方之間不存在直接的調(diào)用關(guān)系,因此需要注意事件的發(fā)送和接收時(shí)序。
事件分發(fā)器是一種松散耦合的機(jī)制,可以在不同的藍(lán)圖之間進(jìn)行數(shù)據(jù)傳
五、使用區(qū)別和注意事項(xiàng)
藍(lán)圖接口和事件分發(fā)器都可以實(shí)現(xiàn)藍(lán)圖之間的通信,但它們的使用方法和適用場(chǎng)景不同。
在使用時(shí)需要注意以下幾點(diǎn):
1. 使用場(chǎng)景的區(qū)別
藍(lán)圖接口通常用于需要共享邏輯或數(shù)據(jù)的場(chǎng)景,例如不同角色的藍(lán)圖需要使用相同的功能或變量。而事件分發(fā)器通常用于消息廣播的場(chǎng)景,例如游戲中需要觸發(fā)某個(gè)事件時(shí),可以通過(guò)事件分發(fā)器向所有需要接收該消息的藍(lán)圖發(fā)送消息。
2. 調(diào)用方式的不同
調(diào)用藍(lán)圖接口時(shí),需要使用“實(shí)現(xiàn)接口”節(jié)點(diǎn)并將接口與實(shí)現(xiàn)進(jìn)行綁定,然后才能調(diào)用接口方法。而調(diào)用事件分發(fā)器時(shí),只需要在需要接收消息的藍(lán)圖中添加事件的響應(yīng)節(jié)點(diǎn),并將事件分發(fā)器與該節(jié)點(diǎn)進(jìn)行綁定。
3. 數(shù)據(jù)傳遞的方式不同
藍(lán)圖接口和事件分發(fā)器都可以用于數(shù)據(jù)傳遞,但它們的傳遞方式不同。在使用藍(lán)圖接口時(shí),數(shù)據(jù)是通過(guò)輸入輸出參數(shù)進(jìn)行傳遞的,而在使用事件分發(fā)器時(shí),數(shù)據(jù)是通過(guò)事件調(diào)用時(shí)所攜帶的參數(shù)進(jìn)行傳遞的。
4. 適用范圍的不同
藍(lán)圖接口和事件分發(fā)器都可以在同一藍(lán)圖中使用,但藍(lán)圖接口還可以在不同藍(lán)圖之間使用。而事件分發(fā)器只能在同一藍(lán)圖或基于同一藍(lán)圖的子藍(lán)圖之間使用。
5. 實(shí)現(xiàn)方式的不同
藍(lán)圖接口需要在藍(lán)圖中定義接口方法,并在實(shí)現(xiàn)接口的藍(lán)圖中添加相應(yīng)的實(shí)現(xiàn)方法。而事件分發(fā)器只需要在藍(lán)圖中定義事件,并在需要接收該事件的藍(lán)圖中添加相應(yīng)的響應(yīng)節(jié)點(diǎn)即可。
在UE5中,在關(guān)卡藍(lán)圖里調(diào)用某個(gè)對(duì)象的事件和在一個(gè)單獨(dú)的藍(lán)圖類里調(diào)用某個(gè)對(duì)象的事件有一些區(qū)別:
作用域不同:關(guān)卡藍(lán)圖里的事件只在該關(guān)卡中生效,而單獨(dú)的藍(lán)圖類可以在多個(gè)關(guān)卡中重復(fù)使用。
對(duì)象綁定方式不同:在關(guān)卡藍(lán)圖里,對(duì)象通常是通過(guò)在場(chǎng)景中直接放置或者在關(guān)卡藍(lán)圖中創(chuàng)建的,而在單獨(dú)的藍(lán)圖類里,通常需要手動(dòng)將對(duì)象引用傳遞給該類。
調(diào)用方式不同:在關(guān)卡藍(lán)圖里,通常通過(guò)拖拽事件節(jié)點(diǎn)來(lái)調(diào)用某個(gè)對(duì)象的事件,而在單獨(dú)的藍(lán)圖類里,可以通過(guò)直接調(diào)用對(duì)象的事件函數(shù)來(lái)實(shí)現(xiàn)。
維護(hù)和管理不同:?jiǎn)为?dú)的藍(lán)圖類可以更方便地進(jìn)行維護(hù)和管理,因?yàn)樗鼈兪且粋€(gè)獨(dú)立的模塊,可以進(jìn)行單獨(dú)的測(cè)試和修改,而關(guān)卡藍(lán)圖通常是和場(chǎng)景緊密耦合的,修改和測(cè)試會(huì)相對(duì)麻煩一些。
總的來(lái)說(shuō),在使用時(shí)需要根據(jù)具體情況選擇使用哪種方式,但單獨(dú)的藍(lán)圖類通常更加方便和靈活。