banner
YZ

周周的Wiki

种一棵树最好的时间是十年前,其次是现在。
zhihu
github
csdn

虛幻引擎遊戲玩法:探索 Actor 之間的高效通信與互動技巧

Actor 通信介紹#

Actor 類似於 Unity 中的空物體 GameObject,一種可以隨意放置到場景中的遊戲物件。UE 提供了多種供不同 Actor 之間通信的方法,本文將通過搭建 Demo 來演示以下表格中四種通信方法的要求和常見用法。

Actor 通信方法表:

通信方法使用場景前提條件示例
直接通信需要調用關卡中某一 Actor 的方法需要引用關卡中的 Actor在關卡中的特定 Actor 上觸發事件。
類型轉換希望驗證 Actor 是否屬於特定類,以便訪問其屬性。需要引用關卡中的 Actor 以類型轉換到所需的 Actor 類。訪問屬於同一父類的子 Actor 的特定功能。
事件分發器通過一個 Actor 來觸發到多個 Actor 的事件。其他 Actor 需要訂閱事件,以便對事件作出響應。通知不同類型的 Actor:某事件已經觸發。
接口當你需要為不同 Actor 添加相同功能時。需要引用關卡中的 Actor,並且該 Actor 需要實現接口。為不同類型的 Actor 添加互動行為。

通信方法演示#

準備工作#

打開虛幻引擎 -- 創建新項目 -- 選擇遊戲 -- 第三人稱遊戲 -- 勾選初學者內容包。

image.png
本 Demo 使用最新虛幻引擎版本 5.4 構建。

直接通信#

本示例將實現由第三人稱角色 Actor 藍圖控制 Cube 的顯隱來演示直接通信方法的使用。

  1. 製作 BP_Cube 藍圖
    打開內容側滑菜單 -- 在內容菜單下新建 MyBlueprints 目錄 -- 右鍵菜單選擇藍圖類 -- 選擇通用下的 Actor 類 -- 命名為 BP_Cube。
    image.png

  2. 添加靜態材質
    雙擊打開 BP_Cube-- 在左邊組件窗口點擊添加 -- 搜索並選擇立方體(Cube)。
    image.png

  3. 編寫 BP_Cube 藍圖
    在左邊我們藍圖下找到函數列表 -- 點擊 + 號添加一個函數 -- 命名為 OnCubeVisible-- 按住鍵盤 Ctrl 鍵 + 鼠標拖拽變量 Cube 到藍圖中 -- 從 Cube 引腳拖出一根線鬆開 -- 搜索並選擇Set Visibility函數。
    image.png

  4. 給函數添加形參
    選中函數 OnCubeVisible-- 在右邊細節面板輸入欄點擊 + 號 -- 添加布林變量 IsVisible-- 將函數參數 Is Visible 引腳連接到 Set Visibility 的 new Visibility 處 -- 點擊編譯保存藍圖。
    image.png

  5. 給第三人稱藍圖 BP_ThirdPersonCharacter 添加按鍵事件
    在內容菜單搜索 BP_ThirdPersonCharacter 並雙擊打開 -- 在藍圖空白處右鍵搜索數字按鍵 0 事件(Keyboard Events節點)。
    image.png
    Pressed引腳拖出一根線鬆開搜索Get Actor Of Class節點 -- 在引腳Actor Class點擊下拉框搜索並選擇 BP_Cube-- 連接Flip Flop節點 -- 從 return value 引腳處拖出顯連接 On Cube Visible 函數。具體連接圖如下:
    image.png

  6. 將 Actor 物體 BP_Cube 從內容菜單拖放至場景中,並運行測試。不斷按下數字鍵盤 0 鍵即可
    cube.gif

類型轉換通信#

本示例將實現由第三人稱角色 Actor 藍圖控制 Cube 的旋轉來演示類型轉換通信方法的使用。
繼續使用 PracticeProject 項目完成這部分工作。

  1. 在 BP_Cube 藍圖編寫旋轉邏輯
    雙擊打開 BP_Cube 藍圖 -- 在變量欄添加 IsRotate 變量 -- 在事件圖標找到Event Tick節點 -- 將其執行引腳拖出連接至Branch分支節點 -- 將 True 引腳連接到Add Actor Local Rotation節點 -- 將 Delta Rotation 引腳的 Z 隨意輸入一個值 -- 將變量 IsRotate 拖出連接至 Branch 的 Condition 節點。
    image.png
    最後將 IsRotate 設置為公開變量(提供其他藍圖設置)。

  2. 編寫 BP_ThirdPersonCharacter 藍圖添加碰撞函數
    在組件 Capsule Component 處右鍵選擇添加事件 -- 將On Component Begin Overlay 和 On Component End Overlap函數添加到事件圖表中。
    image.png

  3. 編寫類型轉換調用邏輯
    在 Begin 節點中,從Other Actor引腳拖出連接到Cast To BP_Cube節點 -- 從 As BP Cube 節點連接到Set Is Rotate節點 -- 將引腳 Is Rotate 勾選。
    同理操作設置 End 節點,只不過需要將最後的 Is Rotate 引擎取消勾選。如下圖
    image.png

  4. 設置角色 Pawn 的碰撞預設
    要使角色發生重疊碰撞,還需要將組件的碰撞預設設置欄勾選 WorldDynamic。
    image.png

  5. 運行測試,靠近 Cube 時旋轉 ,遠離時停止旋轉。
    rotate.gif

事件分發器通信#

類似於 Unity 中的委託事件,全局或局部公開的一個事件分發器,由需要的腳本自由訂閱,只要訂閱了該事件分發器,當事件觸發時,這些訂閱者就能收到消息,處理各自的邏輯。

  1. 編寫一個持有事件分發器的 Actor
    在內容菜單新建一個 Actor 類型的藍圖類 -- 命名為 BP_EeventActor-- 添加一個 Box 組件 -- 並在我的藍圖中事件分發器一欄添加 + 號 -- 添加事件分發器並命名為 OnBoxEvent-- 在事件圖表中添加 On Component Begin Overlay 事件 -- 將事件分發器拖拽到圖表中選擇調用,連接圖如下:
    image.png
    編譯保存,並將其放進場景中任意位置
    image.png
  2. 創建第一個事件接收器 Actor--BP_CircularReceive
    編寫藍圖邏輯,將四個 QuarterCylinder 隱藏。
    添加一個變量命名為 EventActor 在細節面板設置變量類型為 BP_EevntActor, 並設置為公開變量 -- 添加一個變量命名為 CylinderList,在細節面板設置變量類型為 Static Mesh Actor(數組類型),並設置為公開。-- 在 EvenActor 變量細節面板事件欄下添加 On Box Event 右邊的 + 號,開始編寫邏輯:
    image.png
    將 BP_CircularReceive 拖放到場景中,在細節面板分別賦值變量的引用:
    image.png
  3. 編寫第二個事件接收器 Actor--BP_ExplosionActor
    在內容菜單裡搜索Blueprint_Effect_Explosion,將其複製到自己定義的文件夾中並命名為 BP_ExplosionActor-- 將其拖到場景中圓柱的位置,稍微調整一下位置讓在圓柱中間。同上一步一樣添加變量 Eventor,將其事件完善,這裡是啟用爆炸效果。
    image.png
    還需要將兩個子組件 P_Explosion 和 ExplosionAudio 的激活屬性 Auto Activate 取消勾選。最後將其放置場景中並設置變量引用:
    image.png
  4. 測試事件分發器效果
    event.gif

接口通信#

UE5 中,Actor 接口通信是一種非常有效的設計模式,接口負責定義一系列共有的行為或功能,這些行為或功能在不同 Actor 中可以有不同的實現方法。當你為不同 Actor 實現了相同類型的功能時,適合使用此通信方法。

本例中,將實現一個簡單的互動系統,通過在兩個不同 Actor 間通信,學習接口的用法。

  1. 創建接口
    右鍵目錄空白處創建藍圖接口類
    image.png
    雙擊打開添加函數命名為 Interaction
    image.png
  2. 創建可互動開關的燈
    在內容菜單搜索Blueprint_CeilingLight將其複製到自定義的目錄,並重命名為 BP_Light-- 將其放置到場景中。
    雙擊打開藍圖點擊類設置添加接口 BPI_Interaction,編譯保存後再我的藍圖接口欄下右擊 Interaction 接口選擇實現事件可以看到 Event Interaction 節點自動添加到藍圖中。
    image.png
    編寫交替開關燈的邏輯:
    image.png
  3. 創建可互動的球體
    新建一個 Actor 藍圖類命名為 BP_Sphere,添加一個球體組件,同第 2 步一樣添加接口 Interaction 並實現切換材質的邏輯:
    image.png
  4. 修改玩家藍圖並測試接口事件
    找到藍圖 BP_ThirdPersonCharacter,在其 OnComponent Begin Overlap 事件中添加執行節點 Interaction (Message)。
    image.png
    編譯保存並運行:
    interface.gif

總結#

  1. 直接通信

    • 適用於簡單的場景,當你需要直接與特定的 Actor 互動時非常有效。需要確保你有正確的引用。
  2. 類型轉換

    • 當你需要訪問特定類的功能或屬性時,類型轉換是一個很好的選擇。它允許你在運行時驗證和訪問 Actor 的特定功能。
  3. 事件分發器

    • 適合需要廣播事件的場景,能夠讓多個 Actor 響應同一事件,增強了系統的靈活性和擴展性。
  4. 接口

    • 提供了一種靈活的方式為不同類型的 Actor 添加共同的功能。通過接口實現,可以減少代碼重複,提高可維護性。

通過這四種通信方法,開發者可以在 Unreal Engine 中高效地管理 Actor 之間的互動,構建複雜的遊戲邏輯。選擇合適的通信方式能夠提升代碼的可讀性和可維護性,使得項目更加模塊化。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。