Unreal Engine 4 系列教程 Part 2:藍圖教程

原文:Unreal Engine 4 Blueprints Tutorial
作者:Tommy Tran
譯者:Shuchang Liu

在本篇教程里,你將學會如何用藍圖系統(tǒng)創(chuàng)建玩家角色,設置輸入,并編寫角色通過觸碰,收集道具的游戲邏輯。

藍圖是Unreal Engine 4的一套可視化腳本系統(tǒng),通過藍圖可以快速制作游戲原型。你不再需要一行行的編寫代碼,取而代之的是可視化操作:拖拽節(jié)點,在UI里設置節(jié)點參數(shù),給節(jié)點進行連線。

除了作為一款非常便捷的原型工具,藍圖也降低了非開發(fā)人員制作游戲邏輯的門檻。

在本篇教程,你將使用藍圖來:

  • 設置垂直視角攝像機
  • 創(chuàng)建具備基本移動的玩家控制器角色
  • 設置玩家輸入
  • 創(chuàng)建可被角色觸碰并收集的道具

注意:本篇教程假定你已了解Unreal Engine 4的基本操作界面。你也應該熟悉基本的藍圖概念,比如組件和節(jié)點。如果你需要復習以上內(nèi)容,點擊入門教程。

注意:本篇教程只是Unreal Engine 4系列教程的其中一篇:

起步入門

下載示例項目并解壓。進入項目文件夾,雙擊BananaCollector.uproject打開項目。

注意:如果你看到了項目是由較早的引擎版本創(chuàng)建的提示,這很正常(因為引擎經(jīng)常更新版本)。你可以選擇以拷貝副本的形式打開,也可以直接轉(zhuǎn)換項目版本打開。

你可以看到以下的場景。我們創(chuàng)建的角色會在場景內(nèi)移動并收集道具。

為了方便起見,我已經(jīng)給項目文件做了文件夾分類,如下圖所示:

你可以點擊紅框處按鈕來顯示/隱藏側(cè)邊欄列表。

創(chuàng)建玩家

點擊進入Content Browser界面的Blueprints文件夾。點擊Add New按鈕并選擇Blueprint Class。

由于玩家需要能夠獲取輸入,Pawn類比較適合。在彈出窗口選擇創(chuàng)建Pawn,將其命名為BP_Player。

注意:選擇Character類創(chuàng)建也可以,它還默認引入了移動組件。不過,既然我們想要自己動手實現(xiàn)移動,Pawn類已經(jīng)足夠了。

關聯(lián)攝像機

攝像機是玩家觀察游戲世界的方式。我們要創(chuàng)建一個垂直視角觀察玩家角色的攝像機。

在Content Browser 雙擊BP_Player打開藍圖編輯器。

為了創(chuàng)建攝像機,在Components面板點擊Add Component并選擇Camera

為了讓攝像機視角自頂向下,我們需要先把它放在玩家角色上方。選中攝像機組件,再切換到Viewport頁簽。

按下W鍵激活移動操作桿,將攝像機移動到(-1100, 0, 2000)?;蛘?,你可以在Location字段輸入坐標點來移動攝像機。

如果攝像機被移出界面外,按下F鍵就可以重新定位看到攝像機。

接著,按下E鍵激活旋轉(zhuǎn)操作桿,將攝像機沿Y軸旋轉(zhuǎn)-60度。

玩家表示

我們用一個紅色方塊來表示玩家,所以需要使用Static Mesh組件進行展示。

首先,在Components面板左鍵點擊空白處取消選中Camera組件。否則,新加的組件會成為攝像機的子節(jié)點。

點擊Add Component并選擇Static Mesh

為了展示紅色方塊,選擇Static Mesh組件,隨后在Details頁簽Static Mesh屬性點擊下拉框,選擇SM_Cube

你在關卡場景里應該就能看到如下畫面(如果看不到,你可以在Viewport窗口按下F鍵聚焦畫面)

現(xiàn)在,是時候在關卡里動態(tài)生成玩家了。點擊Compile按鈕并回到主編輯器。

生成玩家

為了讓玩家能夠控制角色,你需要明確兩件事:

  1. 玩家所要控制的Pawn類
  2. 角色應該在哪里生成

你可以通過創(chuàng)建Game Mode類(游戲模式類)來實現(xiàn)第一點。

創(chuàng)建游戲模式

游戲模式是一個類,用于控制玩家進入游戲的方式。比如,在多人游戲里,可以使用游戲模式,決定每個玩家在哪里生成。更重要的是,游戲模式?jīng)Q定了玩家使用哪個角色。

在Content Browser里點擊進入Blueprints文件夾。點擊Add New按鈕并選擇Blueprint Class

從彈出窗口里選擇Game Mode Base,并命名為GM_Tutorial

現(xiàn)在,你需要指定哪個Pawn作為默認類。雙擊GM_Tutorial打開藍圖編輯器。

留意Details面板的Classes部分。點擊Default Pawn Class屬性的下拉框,并選擇BP_Player

其次,關卡還需要知道當前使用哪個游戲模式。你可以在World Settings里指明這一點。點擊Compile并關閉藍圖編輯器。

每個關卡都有自己的設置。你可以通過Window\World Settings查看設置。同樣地,也可以在Toolbar選擇Settings\World Settings進行查看。

Details頁簽旁邊就會出現(xiàn)World Settings頁簽。點擊該頁簽的GameMode Override字段,選擇GM_Tutorial。

現(xiàn)在可以看到Game Mode類已經(jīng)修改成GM_Tutorial。

最后,我們還需要指定玩家的生成位置。通過在關卡里放置Player Start(玩家出生點)即可。

放置玩家出生點

在生成玩家的過程中,游戲模式會尋找關卡中是否有玩家出生點。如果有,游戲模式就會在該點生成玩家。

為了放置玩家出生點,在Modes面板搜索Player Start。左鍵拖拽 Player Start至Viewport面板。

你可以隨意放置玩家出生點。放好后,點擊Toolbar的Play按鈕。玩家就會在出生點生成。

如果想要退出游戲,點擊Toolbar的Stop按鈕或按下Esc鍵皆可。如果你看不到鼠標指針,按下Shift+F1。

如果玩家不能控制移動,那其實算不上游戲,對吧?我們的下個任務就是設置輸入控制。

設置輸入

將某個按鍵指定成觸發(fā)某個行為,稱之為按鍵綁定。

在Unreal里,你可以通過按鍵觸發(fā)event(事件)的方式來實現(xiàn)按鍵綁定。事件節(jié)點是一類當接收到特定行為時,觸發(fā)執(zhí)行的節(jié)點(比如在這個例子里,當你按下綁定按鍵時,觸發(fā)執(zhí)行某個事件節(jié)點)。當某個事件被觸發(fā)時,任何跟事件節(jié)點連接的節(jié)點就會被執(zhí)行。

這種按鍵綁定的方式非常有好處,因為這意味著你不需要硬編碼按鍵對應的邏輯。

比如,你綁定了鼠標左鍵并命名為Shoot事件。任何有射擊能力的Actor都可以使用Shoot事件,用于檢測玩家何時按下了鼠標左鍵。如果你想修改射擊對應綁定的按鍵,只要在輸入設置里修改即可。

如果以硬編碼方式實現(xiàn),你需要遍歷每個Actor,分別修改射擊對應綁定的按鍵。

軸映射和操作映射

Edit\Project Settings里可以看到輸入設置。點擊Engine部分的Input選項進入設置界面。

Bindings就是用于設置輸入的部分。

Unreal提供了兩類按鍵綁定方法:

  • Action Mapping(操作映射):這類綁定只有兩種狀態(tài):按下或者沒按下。行為只會在按下或釋放按鍵的時候觸發(fā)。這類綁定適用于沒有中間狀態(tài)的行為,比如槍械射擊。
  • Axis Mapping(軸映射):這類綁定輸出一個稱之為Axis Value(下文有更多介紹)的數(shù)字。每幀都會觸發(fā)對應的軸事件。這類綁定通常用于搖桿或者鼠標。

在這篇教程里,我們會使用Axis Mapping。

創(chuàng)建移動映射

首先,你需要創(chuàng)建兩組Axis Mapping。這樣就可以實現(xiàn)多按鍵觸發(fā)同一個事件。

為了創(chuàng)建一組新的Axis Mapping,點擊Axis Mappings右側(cè)的+號。創(chuàng)建兩組Axis Mapping,分別命名為MoveForwardMoveRight。

MoveForward負責前后移動。MoveRight負責左右移動。

我們需要把移動映射到四個按鍵上:W,A,SD?,F(xiàn)在只有兩個插槽用于映射按鍵。通過點擊每組映射文本框右側(cè)的+號,添加映射插槽。

接著點擊每組插槽的下拉框,將WS鍵映射到MoveForward,AD鍵映射到MoveRight。

接著,我們需要設置Scale字段。

Axis Value和Input Scale

在你設置Scale字段前,我們需要了解它是怎么跟axis values搭配起作用的。

Axis Value的輸出數(shù)值取決于輸入類型和使用方式。按鈕點擊會輸出1。搖桿根據(jù)推動方向和力度,輸出-1~1之間的數(shù)值。

你可以使用Axis Value控制角色的移動速度。比如,如果你把搖桿推到了最邊上,Axis Value是1。如果你只推一半,Axis Value就是0.5。

將Axis Value跟某個速度變量進行相乘,你就能夠調(diào)整搖桿的速度。

你也可以通過Axis Value判斷出方向。如果你將角色速度與一個Axis Value正數(shù)相乘,得到的就是正數(shù)偏移。角色速度與一個Axis Value負數(shù)相乘,得到的就是負數(shù)偏移。將偏移值與角色位置相加,就能知道角色往哪個方向移動了。

由于鍵盤按鍵只能輸出0或1的Axis Value,你可以使用Scale來將其轉(zhuǎn)換成負數(shù)。通過Axis Value和Scale值相乘就可以做到這點。

如果正數(shù)(Axis Value)和負數(shù)(Scale)相乘,按鍵輸出就是負數(shù)。

因此我們點擊修改按鍵SAScale字段文本為-1。

接著,有趣的部分來了:讓角色動起來!關閉項目設置面板,雙擊BP_Player打開藍圖編輯器。

角色移動

首先,你需要獲取移動映射的事件。在事件圖表空白處點擊右鍵打開節(jié)點列表。從彈出菜單中搜索MoveForward。添加處于Axis Events下的MoveForward節(jié)點。注意我們要添加的是Axis Events下的紅色節(jié)點,而非Axis Values下的綠色節(jié)點。

添加MoveRight節(jié)點的步驟同上。

現(xiàn)在,我們需要設置下MoveForward節(jié)點。

使用變量

為了實現(xiàn)移動,我們需要指定角色的運動速度。最簡單的方法是通過變量保存移動速度。

要新建變量,我們點擊My Blueprint頁簽Variable部分的+號。

選中新建的變量,觀察Details頁簽。將變量名重命名為MaxSpeed。隨后,點擊Variable Type的下拉框選擇Float,將變量類型修改為Float。

接著,需要給變量設置默認值。在這之前,先點擊Toolbar上的Compile按鈕。

保持變量選中,在Details頁簽的Default Value區(qū)域,將MaxSpeed的默認值設為10。

接著,將MaxSpeed變量從My Blueprint頁簽拖拽至Event Graph。并選擇彈出菜單的Get

我們現(xiàn)在需要將MaxSpeedAxis Value相乘來得出最終移動速度和方向。添加float * float節(jié)點,并連接Axis ValueMaxSpeed。

獲取角色朝向

為了向前移動,首先需要知道角色的朝向。幸運地是,Unreal里有這樣的節(jié)點。我們需要添加Get Actor Forward Vector節(jié)點。

接著,添加Add Movement Input節(jié)點。該節(jié)點通過獲取方向和數(shù)值,將其轉(zhuǎn)換成移動偏移值。我們按下圖連接各個節(jié)點:

白線代表節(jié)點執(zhí)行順序。換言之,玩家進行操作,觸發(fā)相應事件并執(zhí)行InputAxis MoveForward節(jié)點,隨后執(zhí)行Add Movement Input節(jié)點。

Add Movement Input節(jié)點需要如下輸入:

  • Target:默認為self,在這里就是玩家角色自己(紅色方塊)。
  • World Direction:目標移動方向,在這里就是玩家角色的朝向。
  • Scale Value:玩家移動距離,在這里為Max Speed * Axis Value(值范圍為-1~1)。

MoveRight事件的設置步驟同上,除了要把Get Actor Forward Vector節(jié)點替換為Get Actor Right Vector節(jié)點。試著不對照前面的操作指引,自己動手看看!

添加移動偏移

為了讓角色真正動起來,我們還需要將Add Movement Input節(jié)點計算得出的偏移值,累加到角色當前位置上。

基本上我們的策略就是讓游戲角色每幀移動一點點,所以我們需要在Event Tick事件添加運動節(jié)點,每幀進行調(diào)用。

現(xiàn)在看看Event Graph有沒有Event Tick節(jié)點,它應該處于灰化狀態(tài),如果沒有就創(chuàng)建對應節(jié)點。

為了獲取偏移值,創(chuàng)建Consume Movement Input Vector節(jié)點。要累加偏移值到玩家角色上,還需要添加AddActorLocalOffset節(jié)點。隨后如下圖連接節(jié)點:

這樣意味著在游戲每幀,你會獲取角色的移動輸入,并將其累加在角色當前位置上。

點擊Compile,回到主編輯器并點擊Play。你就能操控紅色方塊四處移動了!

這里有個小問題。高配機器有可能運行幀率更高。由于Event Tick事件每幀調(diào)用,那同等時間內(nèi)運動節(jié)點執(zhí)行的次數(shù)更多。導致的結(jié)果就是高配機器角色移動得更快,反之亦然。

為了避免這個問題,角色運動必須是幀率無關的。

注意:我已經(jīng)做了按鍵綁定用于展示幀率有關會產(chǎn)生的影響。按下數(shù)字鍵0將幀率調(diào)成60,按下數(shù)字鍵1將重置幀率。控制角色四處移動,看看不同幀率對移動速度的影響。

幀率無關

幀率無關意味著不管幀率是多少,相同時間的游戲運行,會產(chǎn)生完全一致的結(jié)果。幸運地是,在Unreal里要做到這點非常容易。

退出游戲,并打開BP_Player。接著,觀察Event Tick節(jié)點的Delta Seconds字段。

Delta Seconds為當前幀的Event Tick調(diào)用與上一幀Event Tick調(diào)用的時間間隔。通過將偏移值與Delta Seconds相乘,角色運動就是幀率無關的。

比如,你的角色最高速度是100。如果距離上一幀Event Tick已經(jīng)過了1秒,則角色移動100個單元。如果只過了0.5秒,則角色運動50個單元。

如果角色運動是幀率相關的,那就會產(chǎn)生不過幀率高低,每幀固定移動100單元的結(jié)果。

為了將偏移值與Delta Seconds相乘,添加vector * float節(jié)點。之后,如下圖進行連線:

由于每幀間隔時間很短,角色移動起來會很慢,所以可以將MaxSpeed的默認值調(diào)大至600

至此恭喜你,成功解鎖了幀率無關成就!

你可能注意到了,方塊現(xiàn)在會穿透其他物體。為了解決這個問題,我們需要用上碰撞檢測

角色碰撞

為了能夠互相碰撞,角色需要一個代表其碰撞區(qū)域(通常稱之為碰撞體)的東西。你可以使用以下任一種:

  • Collision mesh(碰撞網(wǎng)格):這個通常在網(wǎng)格導入時就會生成(如果你勾選了允許)。用戶也可以用3D軟件創(chuàng)建自定義碰撞網(wǎng)格。紅色方塊導入時就自動生成了碰撞網(wǎng)格。
  • Collision component(碰撞組件):一般由三種形狀:盒子,膠囊體和球體。你可以通過Components面板進行添加。通常用于簡單碰撞。

下面就是一個人物和其碰撞體的例子。

當一個碰撞體碰到了另個碰撞體,碰撞就產(chǎn)生了。

設置碰撞

你可能會奇怪,方塊有碰撞體,卻沒有檢測到碰撞。當你移動方塊時,Unreal只認為方塊的根組件可產(chǎn)生碰撞。由于方塊的根組件并沒有任何碰撞體,所以就穿透了其他物體。

注意:一個root組件沒有碰撞體的角色,同樣可以擋住其他角色。但如果你移動這個角色,它是不會與任何物體產(chǎn)生碰撞的。

所以,為了使用碰撞網(wǎng)格,StaticMesh必須作為根組件存在。我們通過在Components面板左鍵拖拽StaticMesh至DefaultSceneRoot。釋放鼠標,StaticMesh現(xiàn)在就成了根組件了。

最后還要做一件事情。切換到Event Graph頁簽,將AddActorLocalOffset節(jié)點的Sweep輸入勾選為true。

簡單來講,AddActorLocalOffset會將角色從舊位置瞬移到新位置上。Sweep可以確保舊位置和新位置之間的物體都能與角色進行碰撞檢測。

回到主編輯器并點擊Play?,F(xiàn)在方塊能與關卡場景產(chǎn)生碰撞了!

創(chuàng)建道具

任何東西都能成為供玩家觸碰拾取的道具。這里我們使用BP_Banana作為道具。

為了檢測方塊是否碰到了道具,我們需要一個在產(chǎn)生碰撞時,觸發(fā)執(zhí)行的事件節(jié)點。我們可以使用碰撞響應來生成事件。

碰撞響應也決定了角色之間的碰撞后行為。有以下三類碰撞響應:IgnoreOverlapBlock。以下是它們互相之間的作用結(jié)果:

雖然可以使用Overlap或Block的任一種,本篇教程只展示如何使用Overlap。

設置碰撞響應

退出游戲并打開BP_Banana。選擇StaticMesh組件并觀察Details面板,Collision部分可以設置碰撞響應。

如圖所示,大部分設置都是灰置的。為了編輯它們,左鍵點擊Collision Presets的下拉框,選擇Custom選項。

現(xiàn)在,你需要指定道具和方塊之間的碰撞響應。

組件有一項屬性稱之為對象類型。對象類型是一種給角色進行簡單分類的方法。你可以在這里了解更多關于對象類型的內(nèi)容。

由于方塊的類型是WorldDynamic,我們需要修改該類型對象的碰撞響應。在Collision Responses設置下,左鍵點擊WorldDynamic中間的勾選框,將碰撞響應改成Overlap。

碰撞處理

為了獲取碰撞情況并進行處理,我們需要用到overlap事件。在Components面板右鍵點擊StaticMesh。從彈出菜單中,選擇Add Event\Add OnComponentBeginOverlap。

Event Graph界面就會出現(xiàn)OnComponentBeginOverlap (StaticMesh)節(jié)點。

最后,添加DestroyActor節(jié)點,并連接OnComponentBeginOverlap (StaticMesh)節(jié)點。顧名思義,該節(jié)點會將目標角色從游戲中移除。由于我們沒有顯式指定Target,所以它會銷毀調(diào)用該節(jié)點的角色。

放置道具

關閉藍圖編輯器,并確保Content Browser打開了Blueprints文件夾。

通過左鍵拖拽 BP_Banana至Viewport界面來在關卡放置香蕉道具。

點擊Play按鈕,開始收集香蕉吧!

后續(xù)學習

你可以在這里下載完整項目。

你現(xiàn)在距離成為Unreal Engine專家又近了一步了。希望這篇教程沒有難倒你。

如果你還想繼續(xù)學習Unreal Engine 4引擎,點擊下篇教程,我會進一步講解Unreal Engine 4引擎的材質(zhì)系統(tǒng)。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容