藍圖間通信是一個復雜關卡能否正常運行的關鍵,筆者在這里提供幾種藍圖類之間的信息交互方法,希望能對讀者有所幫助。
1.類引用
這是最直接的一種藍圖類之間的信息交互方式。首先在Editor中創建2個Actor藍圖類,分別命名為TargetActor和ControllerActor,雙擊打開TargetActor編輯器,將組件窗口中的DefaultSceneRoot替換成Cube,並設置成Movable,編譯后保存退出,然后打開ControllerActor,將組件窗口中的DefaultSceneRoot替換成Sphere,新建變量Actor,類型為Actor引用,將其設為公共變量。返回關卡編輯器中,將2個Actor拖放進場景中
點擊ControllerActor,在Details面板中可以看到Default選項將Actor設為TargetActor或者點擊右側的針狀標記,然后選中場景中的TargetActor
返回ControllerActor編輯器中,添加一個Event Tick事件
運行關卡后可以看到TargetActor在不斷地上升,說明在ControllerActor藍圖類中的邏輯成功地運行了,兩個藍圖類之間完成了信息交互。
2.Get All Actors of Class
Get All Actors of Class是一種整體上的調用,首先在TargetActor的事件圖表中封裝一個函數命名為AddOffset
函數邏輯如下所示,是一個簡單的物體移動操作。
然后在關卡藍圖中添加一個F按鍵驅動事件
可以看到Get All Actors of Class得到的輸出結果是一個數組,它包含了在關卡場景中所有存在的同種類藍圖。運行關卡后按F鍵測試時可以看到TargetActor垂直向上移動,如果在場景中拖放2個或者更多個TargetActor,可以看到所有的Actor都會垂直向上移動,如果只想讓其中的某個或某幾個Actor進行這種移動,可以對輸出數組進行選擇。
3.接口調用
UE4的接口調用技術有點簡單粗暴,而且主要體現在主藍圖對子藍圖的信息通信。
在內容瀏覽器中添加一個藍圖接口,命名為TestInterface
雙擊打開接口,直接使用其創建時自帶的一個接口函數,將其重命名為TestAddOffset
(這里相當於接口的函數定義),新增一個函數輸入命名為Offset,類型為Vector。
在關卡藍圖中將ClassSettings的Interfaces添加剛才創建的TestInterface
添加F按鍵驅動事件
在Get All Actors with Interface中將Interface設置為TestInterface,然后查找TestAddOffset函數(注意這里是調用Message,相當於發送一個調用接口中特定函數的請求),這里隨意設置一個Offset值作為物體的移動距離。
返回TargetActor的藍圖中進行同樣的設置,然后調用Event TestAddOffset(這里相當於接口的函數實現),進行邏輯編寫
完成后運行關卡,可以發現F鍵運行正常。
讀者可以發現一個現象,TestAddOffset事件只可以在子藍圖(像TargetActor,ControllerActor,甚至控制器PlayerController)中調用,但就是無法在關卡藍圖中調用,而調用接口函數的信息方法Get All Actors with Interface則可以在任意藍圖中使用(前提是藍圖中的ClassSettings中添加了該接口),用一個形象化的比喻就像上級領導或同事之間可以命令其去幫你辦事,但下屬是沒有權利命令上級領導的。
4.事件調度
事件調度是一個比較簡便的方法,主要在於區分調度者和被調度者。
一般在調度者藍圖中定義事件調度器。打開ControllerActor藍圖編輯器,添加一個事件調度,命名為OffsetTest
為了便於理解事件調度器是如何工作的,這里給Offset添加一個Vector輸入,命名為NewOffset
在事件圖表中添加1按鍵驅動,將OffsetTest拖入事件圖表中,選擇call選項,並設置NewOffset的值,之后連線編譯。
這里的1按鍵驅動在常規情況下是不會被響應的,所以需要額外的操作,讓控制器在事件開始時給予這個藍圖允許輸入權限就行了
接下來進入TargetActor藍圖中,進行事件的綁定
這里可以理解為在事件開始時通過全局搜索到Offset事件調度器的綁定選項,然后從Event節點綁定一個自定義事件,該事件的輸出就是事件調度器在ControllerActor事件圖表里定義的輸出內容,之后進行物體的移動,整個邏輯就完成了。
運行關卡后按1鍵可以看到物體正常移動了。
以上就是筆者所知道的所有藍圖通信的方法了,歡迎讀者進行完善補充!