【UE4】UE4藍圖基礎

一、藍圖可視化腳本與藍圖系統

1.藍圖腳本

藍圖可視化腳本簡稱“藍圖”或“藍圖腳本”,是一種需要編譯的面向對象的可視化編程語言,藍圖完全集成在UE4中,藍圖通過節點與連線工作。

藍圖腳本的節點

  • 觸發事件,在藍圖腳本中以紅色的節點出現
  • 函數,在看圖腳本中以藍色的節點出現
  • 變量,在藍圖腳本中中以黃色節點出現

2.藍圖系統

藍圖系統又稱“藍圖”或“藍圖類”,藍圖類可以看成是一個包含遊戲內容的容器,其中可以包含組件、腳本或可以僅僅包含數據。

藍圖類有點類似Unity3d中的預設(prefb),藍圖類可以類似預設一般保存對象狀態,可以隨時拖入場景中使用,只是在其他功能上不如預設,如預設在U3D中的打包中可以發揮出優秀的效果,但是藍圖類只能作爲容器使用。

藍圖類包含藍圖腳本,每一個藍圖類都包含一個默認的藍圖腳本。

藍圖類的分類

  • 關卡藍圖:關卡藍圖在每個Level中只能存在一個,負責整個關卡的運行邏輯,關卡的初始化,幀更新都在關卡藍圖裏進行;
  • 普通藍圖:普通藍圖就是UE4的預設,在普通藍圖中我們可以對其中的對象進行一些的配置,如設置網格,貼圖,粒子特效,添加相機,添加物理材質和掛載藍圖腳本等等;
  • 遊戲模式藍圖:UE4中游戲模式也是以藍圖的形式存在的,遊戲模式藍圖控制一系列遊戲的規則;
  • 材質藍圖:在UE4中貼圖材質也是藍圖的形式存在的,在材質藍圖中我們可以如同建模軟件一般對材質進行一系列更高級的材質配置,如下圖的一個簡單示例:

在這裏插入圖片描述

4.創建藍圖

創建藍圖的方法很多,這裏介紹比較常用的方法

  • 可以直接在Content Browser(內容瀏覽器)中右鍵創建一個空的藍圖類,空藍圖除了包含一個根組件外不再包含其他東西,當我們在空藍圖中創建了對象後可以通過拖拽的方式將對象拖動到根組件位置處,用遊戲對象替換根組件作爲根組件,這樣創建空藍圖時的白色小球就會消失;
  • 在World Outliner(世界大綱)中選中游戲對象,可以通過工具欄中的Blueprints工具中的下面兩個選項創建一個包含所選內容的藍圖類;

在這裏插入圖片描述

  • 通過Blueprints工具的New Empty Blueprint Class也可以直接創建空藍圖類;
  • 然而關卡藍圖似乎只能通過Blueprints工具的Open Blueprint Class打開。

二、變量與對象引用

1.在藍圖中創建變量

在藍圖中創建變量的方式有兩種,其一:直接點擊My BluePrint/Variables/+Variable,默認創建bool行的變量,可以點擊變量前的色塊更換變量類型。

在這裏插入圖片描述

其二:在藍圖腳本區域右鍵->輸入Get New Var,可以直接在藍圖腳本中以節點的形式創建變量,在右側細節面板中設置變量的值。

在這裏插入圖片描述

所有創建好的變量都會在My Blueprint面板Variables欄中顯示。

在創建好的變量的Details/Variable/Variable Type選項中可以設置變量爲普通變量、數組、Set容器和Map容器。

在這裏插入圖片描述

2.在藍圖中使用變量

可以直接在藍圖腳本區域右鍵->輸入Get/Set [變量名]即可獲取變量的獲取/設置組件,也可以直接從左側的My Blueprint面板Variables欄中拖拽變量到藍圖腳本區域選擇Get/Set。

3.生成時公開與私有變量

藍圖中的公有與私有與程序中的公有私有有一些不同,藍圖中只分爲生成時公開和私有兩種訪問權限。

生成時公開(Expose on Spawn)

勾選生成時公開後,在藍圖類使用Spawn Actor from Class組件生成藍圖類實例時,勾選生成時公開的變量將可以接受外部值輸入。
在這裏插入圖片描述

如上圖可以看到勾選生成時公開的變量會以輸入接口的形式出現在Spawn Actor from Class節點裏。這裏需要注意的是,勾選Expose on Spawn,還需要勾選Instance Editable,否則會報警告。

私有變量(Private)

設置成私有變量的變量只能在藍圖類裏訪問,藍圖類的外部實例也無法訪問這個變量,如上圖,變量L沒有設置成私有,所以可以通過Spawn Actor from Class組件生成的實例訪問這個變量,而設置成私有的K變量搜索不到Set K節點。

3.在藍圖中使用組件引用

很多時候我們需要調節自身Actor上的組件的某些參數,那麼我們就需要獲得這個組件的引用以便獲取組件上的參數進行調節,那麼我們如何獲得組件的引用呢?

其實方法也很簡單,在My Blueprint/Variabales下有一個子欄“Components”其中存放着當前Actor上的所有的組件的引用,使用方法就是直接將需要的組件引用拖拽到藍圖腳本區域即可。獲得了組件引用我們就可以通過引用使用不同的方法獲取組件上的不同的參數了。

4.動態獲取世界大綱中的Actor

在藍圖腳本中有四個方法獲取外部Actor:

  • Get All Actor of Class:通過類型來獲取外部Actor

在這裏插入圖片描述

  • Get All Actor with Tag:通過標籤來獲取外部Actor

在這裏插入圖片描述

  • Get All Actor with Interface:通過外部接口在獲取外部Actor

在這裏插入圖片描述

  • Get Actors:通過層來獲取Actor

在這裏插入圖片描述

三、藍圖的數據類型

1.5個基本數據類型

UE4藍圖中基本數據類型只有5個,需要注意的是藍圖中沒有char、double、short、long等數據類型,在C++與藍圖的配合使用時需要注意這些類型的變量。

Boolean

Byte

8位,一字節,0-255。

Integer

32位整型,四字節。

Integer64

64位整型,八字節,能存儲更大的數。

Float

32位單精度浮點型,其中1符號位、8指數位、23數值位,UE4中默認保留小數點後6位。UE4中只有Float類型沒有Double類型。

2.3種字符串

String

藍圖中String類型就是藍圖C++中的FString類型,普通字符串,可以對其中的字符進行增刪查改。

Name

Name是一種固定字符串類型,變量初始化以後不能在對其中的內容進行修改,且Name類型的字符串不區分大小寫,多用於作爲全局變量來唯一標識對象。Name類型的字符串在運行過程中存儲於內存的字符串表中,使用效率高。

Text

Text是String的長度加強版,通常用於存儲一段文字並可以進行國際化處理。

3.Vector(維度向量)

Vector

默認創建的Vector是Vector 3D,即三維量,包含x、y、z三個值,可以表示任何任何三維量,如:三維座標和RGB等。

Vector 2D 和Vector 4

Vector 2D就是二維量,Vector 4就是四維量,常用於表示四元素。

Two Vectors

Two Vectors就是一個關於Vector的pair(對組),pair在C++的STL種較爲常用,是一個只包含兩個元素的容器。

4.Rotator(三維旋轉量)

包含:

x:roll,翻滾角,以x爲軸,進行yz平面的旋轉;

y:pitch,俯仰角,以y爲軸,進行xz平面的旋轉;

z:yaw,航向角,以z爲軸,進行xy平面的旋轉。

5.Transform

Transfrom類型是一個3*3的矩陣,包含Location、Rotation和Scale三個三維向量。

四、條件語句

1.Branch(if條件判斷)

在這裏插入圖片描述

傳入一個bool值,進行分流,通常和比較組件配合使用,如:“==”、“>”等。

2.Switch

在這裏插入圖片描述

  • Selection:case判斷的變量;
  • Default:默認執行分支;
  • Add pin:添加執行分支。

五、循環語句

1.For Loop(for循環)

在這裏插入圖片描述

  • First Index/Last Index:提供循環的次數;
  • Loop Body:循環體執行分支;
  • Index:返回當前循環索引;
  • Conpleted:循環完畢後執行分支。

2.For Loop whit Break(可跳出的for循環)

在這裏插入圖片描述

使用方法和For Loop類似。

3.For Each Loop(數組遍歷)

在這裏插入圖片描述
專門有用遍歷數組的循環。

  • Array:需要遍歷的數組;
  • Loop Body:循環體分支;
  • Array Element:遍歷的數組元素;
  • Array Index:當前索引;
  • Completed:遍歷結束執行分支。

4.For Each Loop with Break(可跳出的數組遍歷)

在這裏插入圖片描述

用法和Foreach Loop一樣,只是多了一個跳出執行分支。

5.Reverse for Each Loop(反向數組遍歷)

在這裏插入圖片描述

6.While Loop(while循環)

在這裏插入圖片描述

六、數組

1.創建數組

創建數組要比創建變量多一個步驟,首先我們需要創建一個變量,然後再將這個變量的Details/Varialble Type選項的右側色塊選擇九宮格,即可將對應變量轉換成對應類型的數組。

在這裏插入圖片描述

2.爲數組賦值

Add(Array)

在這裏插入圖片描述

傳入一個數組和一個元素即可通過Add(Array)組件爲組數賦值

如:

在這裏插入圖片描述

循環完畢後數組Array內便存儲有0-10的是個int型元素。

3.獲取元素

Get(a copy)

在這裏插入圖片描述

獲取指定索引的元素的拷貝。

Get(a ref)

在這裏插入圖片描述

獲取指定索引的元素的引用。

4.插入元素

Add(Aray)

直接在數組的末尾插入元素的方法也是使用Add(Array)組件,Add(Array)組件的的插入過程就是直接在數組的末尾插入元素。

Insert

在這裏插入圖片描述
指定位置插入使用Insert組件,輸入參數從上至下依次爲目標數組、要插入的元素、目標插入的索引位置。

當要使用Insert組件在數組末尾插入,而又不知道數組大小時,可以使用Last Index組件直接獲取輸入數組的尾索引,當然直接使用只會在最後一個索引位置插入,而使最後一位元素向後移動一位,而達不到在數組尾部插入的效果,所以需要加一食用。

在這裏插入圖片描述

Set Array Elem

在這裏插入圖片描述

設置輸入數組指定索引的元素的值,Size to Fit選項可以設置如果指定索引不存在時數組自動擴充size大小。

5.查找元素

Contains Item

在這裏插入圖片描述
Contains Item組件可以查找指定數組中是否包含某一元素,但是Contains Item只返回bool的判斷結果,不會返回目標的索引值。

Find Item

在這裏插入圖片描述

Find Item則是從輸入數組中查找指定元素並返回第一次查找到該元素的索引值。

6.刪除元素

Remove Index

在這裏插入圖片描述
通過索引刪除元素

Remove Item

在這裏插入圖片描述

從輸入數組中移除指定元素,Remove Item會刪除數組中所有指定的元素,如果刪除成功則返回true,失敗則返回false。

7.篩選元素

Filter Array

在這裏插入圖片描述

過濾數組可以按類型來篩選數組元素,用於父類型數組存儲子類型元素時進行類型篩選,如:Actor數組篩選MyClass類型元素,Filter Array返回一個篩選後的新數組。

8.清空數組

在這裏插入圖片描述

使用Clear組件可以將數組內的元素全部清空。

9.獲取數組長度

在這裏插入圖片描述

10.設置數組長度

在這裏插入圖片描述

七、結構體

1.結構體創建

藍圖中結構體的創建是沒辦法在藍圖腳本視圖中創建的,UE4藍圖中結構體是與藍圖腳本同級的藍圖類,創建藍圖結構體的方法:在Content Browser中右鍵->Create Advanced Assect/Blueprint欄->Structure,即可創建一個結構體,創建出來的結構體默認擁有一個bool值得成員變量。

在這裏插入圖片描述

2.定義成員變量

藍圖中得結構體只能創建成員變量,不能創建成員函數,成員變量可以直接設置默認值。
在這裏插入圖片描述

3.結構的使用

將結構體創建好以後便可以直接在藍圖腳本中搜索到並使用了。

八、枚舉

1.枚舉的創建

枚舉的創建和使用和結構體區別不大,創建方式一如結構體一般,Content Browser中右鍵->Create Advanced Assect/Blueprint欄->Enumeration,創建好後UE4也會在一個新的視圖中對枚舉進行編輯,枚舉的編輯操作也相當簡單,只有向枚舉中添加與刪除元素的操作,這些元素都可以添加註解提示,枚舉也可以添加整個枚舉的註解提示。

2.枚舉的使用

枚舉的使用就如同變量的使用一般,沒有什麼可說的。

九、接口

1.接口的定義

接口的定義和和藍圖函數庫,藍圖宏庫一樣,但是接口的不像函數庫和宏庫一般可以再一個藍圖類中定義多個函數和宏,接口就是一個藍圖類,並且接口的編輯界面及其簡約,可編輯視圖只有一個My Blueprint和一個Detials,在My Blueprint/Functions欄可以新建接口函數,在對應的接口函數的Details/Graph可以設置一些接口函數的描述和Const屬性,在Details/Inputs和Outputs欄可以設置接口函數的輸入與輸出參數。

2.接口的繼承

接口是一個抽象藍圖,接口的實現必須通過繼承接口的藍圖來實現,在藍圖中接口繼承通過Toolbar/Class Settings/Interfaces欄即可添加接口到當前藍圖類是指繼承此接口。

3.接口的實現

無返回值的接口實現

在一個藍圖繼承了一個無返回值得接口後,這個接口將以事件的形式出現在這個藍圖類的All Actions for this Blueprint裏

如:

在這裏插入圖片描述

藍圖以這個事件作爲接口函數的入口,以此節點開始便可以開始實現各個藍圖類各自繼承的接口函數的邏輯了。

有返回值得接口實現

有返回值的接口不會以事件的形式出現在Add Event裏,而是會直接出現在My Blueprint/Interface欄裏,我們雙擊即可打開接口函數的編輯視圖,在視圖中實現接口即可。

在這裏插入圖片描述

4.接口函數的調用

藍圖通過[接口名](Mesasge)組件來調用接口中的函數,如下圖中的Interface1(Message)和Interface2(Message)。
在這裏插入圖片描述
在這裏插入圖片描述

接口的使用需要指定使用的接口是哪個藍圖類中實現的接口和接口需要傳入的參數。在藍圖類的My Blueprint/Variables欄是可以搜索到我們自己創建的藍圖類的,通過過去藍圖類的引用便可以指定接口函數的實現者了。當然我們也可以使用Get All Actors with Interface組件來獲取實現了指定接口的所有藍圖類,然後再對這些藍圖類中實現的函數進行調用。

十、藍圖函數庫

藍圖函數庫是一個可以被所有藍圖類調用的函數集合,藍圖函數庫裏的方法全部都被定義爲靜態方法,用於定義一些不與特定遊戲對象綁定的功能性函數的實現。

1.創建藍圖函數庫

創建藍圖函數庫的方式和創建結構體類似,在Content Browser中右鍵->Create Advanced Assect/Blueprint欄->Bluprint Function LiberLibrary。

2.實現藍圖函數庫裏的函數

和結構體一樣,創建好的藍圖函數庫UE4會創建一個新的界面用於編輯庫裏函數;

  • 在My Blueprint/Functions欄可以申明函數
  • 在My Blueprint/Local Variables欄可以生命局部變量,在其Details中可以設置局部變量默認值;
  • 在對應函數的Details/Input和Output欄可以分別設置函數的輸入輸出參數
  • 在腳本編輯區可以實現函數邏輯。

3.使用藍圖函數庫裏的函數

要使用藍圖函數庫裏的函數,可直接在腳本編輯區右鍵輸入函數名即可在Class欄中看到藍圖函數庫裏的函數了。

十一、藍圖宏庫

宏在UE4中幾乎無處不在,藍圖宏庫是開發者使用藍圖自定義的一系列的宏的容器,藍圖宏庫和藍圖函數庫一樣可以定義多個宏;

  • 藍圖宏庫與藍圖函數庫不同的是,藍圖宏庫中的宏是在預編譯過程中完成處理的,即藍圖宏庫不需要編譯;
  • 自定義的宏,可以有任意數量的輸入輸出引腳,即一個宏可以沒有輸出引腳,這樣的宏可以只進行數據處理,一個宏也可以有多個輸入輸出引腳,這樣的宏可以根據不同的邏輯選擇不同的執行流,而藍圖函數庫中的函數必須有且只有一個輸入和一個輸出引腳;
  • 與函數不同,宏中不可以再定義成員變量,即宏只負責處理邏輯,不提供暫存能力。

1.創建藍圖宏庫

宏庫的創建與函數庫的創建是一樣的,在Content Browser中右鍵->Create Advanced Assect/Blueprint欄->Bluprint Macro LiberLibrary。

2.藍圖宏聲明

  • 在My Blueprint/Macro中可以聲明一個宏;
  • 在指定宏的Details/Inputs和Outputs中可以定義輸入與輸出引腳和參數。

3.藍圖宏的使用

和藍圖函數的使用方法一致。

4.自定義流程控制

除了藍圖提供給我們的條件語句和循環語句等流程控制語句外,我還可以使用宏編寫自己的流程控制,因爲宏可以有多個輸入和輸出引腳,使用方法就是使用宏的形式定義自己的流程控制邏輯,通過不同的輸入給予不同輸出,即可達到自定義流程控制的目的。

十二、事件

除了UE4藍圖中給我們提供大量的預定義事件,我也可以自定義事件。

1.事件的定義

事件的定義也很簡單,在All Actions for this Buleprint中選擇Add Custom Event,便可以創建一個自定義事件的入口,之後通過這個入口實現事件的內部邏輯,一個事件便定義完成。

2.事件的調用

事件調用必須通過實現這個事件的藍圖類纔可以對其中的事件進行調用。如:

在這裏插入圖片描述

Event Blueprint爲實現自定義事件的藍圖類;

Print Str爲自定義事件。

3.事件調度器

事件調度器的創建與使用請閱讀目錄:十七、藍圖類的通信/3.使用事件調度器進行通信

十三、藍圖模塊

藍圖中可以將一個複雜了邏輯處理合併成一個節點模塊,從而簡化整體的執行流複雜度,使藍圖的執行流變得簡單明瞭。我們可以將需要合併的執行流多選選中然後右鍵,即可在Organization欄中通過Collapse Nodes選項來合併執行流。
在這裏插入圖片描述

除了將執行流合併成節點外,藍圖還提供將多個執行流合併成一個函數或一個宏的功能。合併好的模塊也可以在Organizition/Expand Node進行模塊分離。

十四、角色控制

1.爲角色添加跟隨相機

相對U3D來說,UE4的相機跟隨要簡單得多,UE4中直接將相機設置成了藍圖類的組件,當藍圖類時Player時,即可實現相機對Player的跟隨了。

相機跟隨需要通過一個物理組件Spring Arm來鏈接相機和Player,將相機附着在Spring Arm下,即可在Spring Arm的作用下實現相機跟隨。

在這裏插入圖片描述

2.爲角色添加控制器

在UE4的遊戲製作過程中,我們不難發現當我們運行遊戲時,在世界大綱中多出了很多東西,如下圖:
在這裏插入圖片描述

其實,UE4爲我們提供很多已經預製好的必須品,如上圖的PlayerController(角色控制器)、PlayerCameraMenager(角色相機管理器)等。也就是說不可以直接使用UE4預製給我們的角色控制器來控制我們的Player,而不需要自己再去爲Player藍圖配置角色控制器了,我們只需將Player的細節面板上的Auto Possess Player設置成Player0即可,Player0即表示本地角色。
在這裏插入圖片描述

需要注意的是,對於角色控制更優的方式是使用Player Start組件去持有Player藍圖類,再通過Player Controller來控制Player Start達到控制角色的目的。

3.自定義遊戲模式

在我們創建一個UE4工程後,UE4會啓用UE4默認的遊戲模式GameModeBase,GameModeBase就控制着Player Controller、PlayerCameraMenager、PlayerState等運行時UE4動態生成的一些遊戲物體,我們可以通過啓用我們自定義的遊戲模式來設置這些遊戲物體按自己的定義的規則來生成運行。

遊戲模式也是一個藍圖類,創建遊戲模式就是創建藍圖類,只是這個藍圖類需要繼承自GameModeBase類,繼承自GameModeBase類的藍圖就是一個遊戲模式藍圖。不過在我們第一此=次打開遊戲模式藍圖時,UE4會將遊戲模式藍圖識別成一個普通藍圖,而進入普通藍圖的編輯模式,可能是bug吧,此時我們只需將藍圖關閉,再打開一次,UE4便可以識別出遊戲模式藍圖了。

遊戲模式藍圖中可以定義自己的遊戲模式規則,比如我們可以通過修改Spectator Class選項爲自定義的遊戲物體,這樣在遊戲運行時,UE4將不再生成DefaulPawn,而是會生成我們指定的遊戲物體。
在這裏插入圖片描述
配置好遊戲模式後我們還需要讓當前項目使用我們自定義的遊戲模式,通過Seettings ->Project Settings->Project/Maps&Modes->Dfault GameModes,選擇我們自己的配置的遊戲模式即可讓當前項目啓用我們自己定義的遊戲模式了

在這裏插入圖片描述

4.操控角色控制器

我們要操控角色控制器就需要配置鍵盤按鍵映射,配置好的鍵盤映射會以函數的形式加入藍圖腳本組件集中。

我們在Seettings ->Project Settings->Engine/Input->Bindings/Axis Mappings設置鍵盤映射並可以配置映射的值,
在這裏插入圖片描述

配置好鍵盤映射以後便可以在藍圖腳本中使用這些函數主鍵來控制我們Player了,控制角色運動的方法很多,我這裏以旋轉力矩的方式來控制小球運動,具體的控制方法如下:

在這裏插入圖片描述
加入兩個鍵盤映射函數組件(InputAxis MoveF/B,InputAxis MoveL/R)、兩個添加角度力矩的組件(Add Torque in Radians,Add Torque in Radians),但是添加角度力矩組件是需要一個控制目標的,我們需要從左側的My Blueprint面板的Components中將需要控制的物體Player拖入腳本藍圖中,分別連接到添加角度力矩組件的Target上。

這裏還需要注意的一點是,在我們爲Player添加相機時,相機使用的是相對於Player的局部座標,使用局部座標的相機會跟隨Player旋轉,而使用世界座標的相機將會固定某一個角度跟隨Player移動。切換方法爲:下拉Spring Arm的細節面板/Transform/Rotation的三角箭頭選擇切換。

並且相機默認情況下是啓用了物理碰撞的,但大多數情況下我們是不需要讓相機出現物理碰撞的,所以我們也應當取消相機的物理碰撞。操作方法爲:取消Spring Arm的細節面板/Camera Collision/Do Collision Test選項。

當然要想比較真實的模擬出物理效果,光這樣是不行的,因爲默認情況下Player是沒有啓動物理模擬的,我們需要啓用Player的細節面板/Physics/Simulate Physics選項,並且將調節Player的細節面板/Linear Damping(線性摩檫)和Player的細節面板/Angular Damping(旋轉摩檫)到適當的值,應爲UE4默認是沒有旋轉摩檫的並且,默認線性摩檫爲0.01。

小知識

  • 大多數時候我們都需要勾選作用力函數組件的Acel Change選項,如:上面的Add Torque in Radians,勾選了Acel Change選項作用力組件會在作用目標物體時忽略物體的質量因素,因爲存在質量影響的話,我們可能需要給一個極大的力才能推動目標物體;
  • 有時可能默認大小的作用力對目標物體的移動作用達不到我們理想的效果,此時可以先將作用力加倍後在傳遞給作用力組件,藍圖腳本組件集中提供多種多樣的乘積組件,我們上面使用的是float*float組件

十五、觸發器

在遊戲設計中觸發器的使用是非常平凡的,而在藍圖中觸發器的實現也並不複雜,我們來看一下具體操作:

1.創建觸發器

  • 藍圖模式中游戲的一切都是藍圖,觸發器也不例外,所以要做一個觸發器,首先我們的創建一個藍圖的殼子,並繼承自Actor類
  • 觸發器還需要一個極爲重要的東西就是碰撞體,當然這裏的碰撞體不是具有物理碰撞的網格碰撞體,而是藍圖的物理組件集中的Box Collison,一個沒有物理碰撞效果專門用於觸發器的盒碰撞體,我們給藍圖類添加這個組件,一個觸發器便完成了

2.使用觸發器

當觸發器放置於場景中,有物體進入觸發器碰撞盒時,觸發器便會出自動發觸發Event ActorBeginOverlap時間組件,之後我們便可以進行一系列邏輯操作了。

十六、藍圖類的通信

1.使用引用進行通信

兩個藍圖類要想通過引用進行通信,那麼其中一個藍圖類就必須擁有另一個藍圖類的引用,如何獲取一個藍圖類的引用呢?

在My Blueprint/Variables欄中添加一個所需要引用的藍圖類類型的變量,勾選它的Details/Variable/Instance Editable選項,就可以在這個藍圖類的實例的Details/Default欄中看到引用變量(如果不勾選是沒有default欄的),如此便可以方便的獲取另一個藍圖類的實例的引用了。

通過引用兩個藍圖類之間便可以進行單向的信息傳遞了。即擁有引用的藍圖類可以獲取所引用藍圖的傳遞過來的信息,反向則不行。

2.使用接口進行通信

使用接口進行通信的好處是可以很便利的通過同一事件讓各種不同的藍圖做出不同的反應,如:當受到子彈攻擊時,牆會反彈子彈,人會受傷,通過接口通信來實現這個效果就是,創建一個受到子彈攻擊的接口OnTakeAttack,然後分別讓牆和人都繼承這個接口並實現不同的效果,如此當受到子彈攻擊時,我們便可以通過Get All Actor with Interface來調用實現這些接口的Actor來做出各自的反應。

接口的實現與使用請閱讀目錄:九、接口。

3.使用事件調度器通信

事件調度器的通信過程是一個調度者與一個或多個被調度者之間的通信過程,類似觀察者模式的通信過程。

創建事件調度器

使用事件調度器來進行藍圖通信,首先我們需要擁有一個事件調度器;

事件調度器只能被擁有者調用,所以我們需要在調度者藍圖上創建事件調度器,在My Blueprint/Event Dispatchers欄可以新建一個藍圖調度器,此時這個藍圖便擁有了一個事件調度器,我們可以通過拖拽事件調度器到腳本編輯視圖或直接在All Actions for this Blueprint中搜索,可以對事件調度器進行事件綁定(Bind)、事件解綁(Unbind)、解綁全部事件(Unbind all),直接爲事件調度器綁定新事件(Assign)和調用事件調度器(Call)。當一個事件調度器被調用後,與這個事件調度器綁定的事件都會被調用,一次來達到信息傳遞的目的。

綁定事件

調度者要事件調度器調用被調度者的事件,那麼被調度者就需要向調度者的事件調度器上綁定事件,通過Bind Event to [事件調度器名]組件來綁定事件到事件調度器上。

在這裏插入圖片描述

Target:輸入事件調度器的擁有者對象

Event:需要綁定的事件

如此一個基於事件調度器的通信機制便完成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章