Actor 通信介紹#
Actor 類似於 Unity 中的空物體 GameObject,一種可以隨意放置到場景中的遊戲物件。UE 提供了多種供不同 Actor 之間通信的方法,本文將通過搭建 Demo 來演示以下表格中四種通信方法的要求和常見用法。
Actor 通信方法表:
通信方法 | 使用場景 | 前提條件 | 示例 |
---|---|---|---|
直接通信 | 需要調用關卡中某一 Actor 的方法 | 需要引用關卡中的 Actor | 在關卡中的特定 Actor 上觸發事件。 |
類型轉換 | 希望驗證 Actor 是否屬於特定類,以便訪問其屬性。 | 需要引用關卡中的 Actor 以類型轉換到所需的 Actor 類。 | 訪問屬於同一父類的子 Actor 的特定功能。 |
事件分發器 | 通過一個 Actor 來觸發到多個 Actor 的事件。 | 其他 Actor 需要訂閱事件,以便對事件作出響應。 | 通知不同類型的 Actor:某事件已經觸發。 |
接口 | 當你需要為不同 Actor 添加相同功能時。 | 需要引用關卡中的 Actor,並且該 Actor 需要實現接口。 | 為不同類型的 Actor 添加互動行為。 |
通信方法演示#
準備工作#
打開虛幻引擎 -- 創建新項目 -- 選擇遊戲 -- 第三人稱遊戲 -- 勾選初學者內容包。
本 Demo 使用最新虛幻引擎版本 5.4 構建。
直接通信#
本示例將實現由第三人稱角色 Actor 藍圖控制 Cube 的顯隱來演示直接通信方法的使用。
-
製作 BP_Cube 藍圖
打開內容側滑菜單 -- 在內容菜單下新建 MyBlueprints 目錄 -- 右鍵菜單選擇藍圖類 -- 選擇通用下的 Actor 類 -- 命名為 BP_Cube。
-
添加靜態材質
雙擊打開 BP_Cube-- 在左邊組件窗口點擊添加 -- 搜索並選擇立方體(Cube)。
-
編寫 BP_Cube 藍圖
在左邊我們藍圖下找到函數列表 -- 點擊 + 號添加一個函數 -- 命名為 OnCubeVisible-- 按住鍵盤 Ctrl 鍵 + 鼠標拖拽變量 Cube 到藍圖中 -- 從 Cube 引腳拖出一根線鬆開 -- 搜索並選擇Set Visibility函數。
-
給函數添加形參
選中函數 OnCubeVisible-- 在右邊細節面板輸入欄點擊 + 號 -- 添加布林變量 IsVisible-- 將函數參數 Is Visible 引腳連接到 Set Visibility 的 new Visibility 處 -- 點擊編譯保存藍圖。
-
給第三人稱藍圖 BP_ThirdPersonCharacter 添加按鍵事件
在內容菜單搜索 BP_ThirdPersonCharacter 並雙擊打開 -- 在藍圖空白處右鍵搜索數字按鍵 0 事件(Keyboard Events節點)。
從Pressed引腳拖出一根線鬆開搜索Get Actor Of Class節點 -- 在引腳Actor Class點擊下拉框搜索並選擇 BP_Cube-- 連接Flip Flop節點 -- 從 return value 引腳處拖出顯連接 On Cube Visible 函數。具體連接圖如下:
-
將 Actor 物體 BP_Cube 從內容菜單拖放至場景中,並運行測試。不斷按下數字鍵盤 0 鍵即可
類型轉換通信#
本示例將實現由第三人稱角色 Actor 藍圖控制 Cube 的旋轉來演示類型轉換通信方法的使用。
繼續使用 PracticeProject 項目完成這部分工作。
-
在 BP_Cube 藍圖編寫旋轉邏輯
雙擊打開 BP_Cube 藍圖 -- 在變量欄添加 IsRotate 變量 -- 在事件圖標找到Event Tick節點 -- 將其執行引腳拖出連接至Branch分支節點 -- 將 True 引腳連接到Add Actor Local Rotation節點 -- 將 Delta Rotation 引腳的 Z 隨意輸入一個值 -- 將變量 IsRotate 拖出連接至 Branch 的 Condition 節點。
最後將 IsRotate 設置為公開變量(提供其他藍圖設置)。 -
編寫 BP_ThirdPersonCharacter 藍圖添加碰撞函數
在組件 Capsule Component 處右鍵選擇添加事件 -- 將On Component Begin Overlay 和 On Component End Overlap函數添加到事件圖表中。
-
編寫類型轉換調用邏輯
在 Begin 節點中,從Other Actor引腳拖出連接到Cast To BP_Cube節點 -- 從 As BP Cube 節點連接到Set Is Rotate節點 -- 將引腳 Is Rotate 勾選。
同理操作設置 End 節點,只不過需要將最後的 Is Rotate 引擎取消勾選。如下圖
-
設置角色 Pawn 的碰撞預設
要使角色發生重疊碰撞,還需要將組件的碰撞預設設置欄勾選 WorldDynamic。
-
運行測試,靠近 Cube 時旋轉 ,遠離時停止旋轉。
事件分發器通信#
類似於 Unity 中的委託事件,全局或局部公開的一個事件分發器,由需要的腳本自由訂閱,只要訂閱了該事件分發器,當事件觸發時,這些訂閱者就能收到消息,處理各自的邏輯。
- 編寫一個持有事件分發器的 Actor
在內容菜單新建一個 Actor 類型的藍圖類 -- 命名為 BP_EeventActor-- 添加一個 Box 組件 -- 並在我的藍圖中事件分發器一欄添加 + 號 -- 添加事件分發器並命名為 OnBoxEvent-- 在事件圖表中添加 On Component Begin Overlay 事件 -- 將事件分發器拖拽到圖表中選擇調用,連接圖如下:
編譯保存,並將其放進場景中任意位置
- 創建第一個事件接收器 Actor--BP_CircularReceive
編寫藍圖邏輯,將四個 QuarterCylinder 隱藏。
添加一個變量命名為 EventActor 在細節面板設置變量類型為 BP_EevntActor, 並設置為公開變量 -- 添加一個變量命名為 CylinderList,在細節面板設置變量類型為 Static Mesh Actor(數組類型),並設置為公開。-- 在 EvenActor 變量細節面板事件欄下添加 On Box Event 右邊的 + 號,開始編寫邏輯:
將 BP_CircularReceive 拖放到場景中,在細節面板分別賦值變量的引用:
- 編寫第二個事件接收器 Actor--BP_ExplosionActor
在內容菜單裡搜索Blueprint_Effect_Explosion,將其複製到自己定義的文件夾中並命名為 BP_ExplosionActor-- 將其拖到場景中圓柱的位置,稍微調整一下位置讓在圓柱中間。同上一步一樣添加變量 Eventor,將其事件完善,這裡是啟用爆炸效果。
還需要將兩個子組件 P_Explosion 和 ExplosionAudio 的激活屬性 Auto Activate 取消勾選。最後將其放置場景中並設置變量引用:
- 測試事件分發器效果
接口通信#
UE5 中,Actor 接口通信是一種非常有效的設計模式,接口負責定義一系列共有的行為或功能,這些行為或功能在不同 Actor 中可以有不同的實現方法。當你為不同 Actor 實現了相同類型的功能時,適合使用此通信方法。
本例中,將實現一個簡單的互動系統,通過在兩個不同 Actor 間通信,學習接口的用法。
- 創建接口
右鍵目錄空白處創建藍圖接口類
雙擊打開添加函數命名為 Interaction
- 創建可互動開關的燈
在內容菜單搜索Blueprint_CeilingLight將其複製到自定義的目錄,並重命名為 BP_Light-- 將其放置到場景中。
雙擊打開藍圖點擊類設置添加接口 BPI_Interaction,編譯保存後再我的藍圖接口欄下右擊 Interaction 接口選擇實現事件可以看到 Event Interaction 節點自動添加到藍圖中。
編寫交替開關燈的邏輯:
- 創建可互動的球體
新建一個 Actor 藍圖類命名為 BP_Sphere,添加一個球體組件,同第 2 步一樣添加接口 Interaction 並實現切換材質的邏輯:
- 修改玩家藍圖並測試接口事件
找到藍圖 BP_ThirdPersonCharacter,在其 OnComponent Begin Overlap 事件中添加執行節點 Interaction (Message)。
編譯保存並運行:
總結#
-
直接通信:
- 適用於簡單的場景,當你需要直接與特定的 Actor 互動時非常有效。需要確保你有正確的引用。
-
類型轉換:
- 當你需要訪問特定類的功能或屬性時,類型轉換是一個很好的選擇。它允許你在運行時驗證和訪問 Actor 的特定功能。
-
事件分發器:
- 適合需要廣播事件的場景,能夠讓多個 Actor 響應同一事件,增強了系統的靈活性和擴展性。
-
接口:
- 提供了一種靈活的方式為不同類型的 Actor 添加共同的功能。通過接口實現,可以減少代碼重複,提高可維護性。
通過這四種通信方法,開發者可以在 Unreal Engine 中高效地管理 Actor 之間的互動,構建複雜的遊戲邏輯。選擇合適的通信方式能夠提升代碼的可讀性和可維護性,使得項目更加模塊化。