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

原文:Unreal Engine 4 Blueprints Tutorial
做者:Tommy Tran
譯者:Shuchang Liuhtml

在本篇教程裏,你將學會如何用藍圖系統建立玩家角色,設置輸入,並編寫角色經過觸碰,收集道具的遊戲邏輯。web

藍圖是Unreal Engine 4的一套可視化腳本系統,經過藍圖能夠快速製做遊戲原型。你再也不須要一行行的編寫代碼,取而代之的是可視化操做:拖拽節點,在UI裏設置節點參數,給節點進行連線。app

除了做爲一款很是便捷的原型工具,藍圖也下降了非開發人員製做遊戲邏輯的門檻。編輯器

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

  • 設置垂直視角攝像機
  • 建立具有基本移動的玩家控制器角色
  • 設置玩家輸入
  • 建立可被角色觸碰並收集的道具

注意:本篇教程假定你已瞭解Unreal Engine 4的基本操做界面。你也應該熟悉基本的藍圖概念,好比組件和節點。若是你須要複習以上內容,點擊入門教程svg

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

起步入門

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

注意:若是你看到了項目是由較早的引擎版本建立的提示,這很正常(由於引擎常常更新版本)。你能夠選擇以拷貝副本的形式打開,也能夠直接轉換項目版本打開。動畫

你能夠看到如下的場景。咱們建立的角色會在場景內移動並收集道具。ui

爲了方便起見,我已經給項目文件作了文件夾分類,以下圖所示:

你能夠點擊紅框處按鈕來顯示/隱藏側邊欄列表。

建立玩家

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

因爲玩家須要可以獲取輸入,Pawn類比較適合。在彈出窗口選擇建立Pawn,將其命名爲BP_Player

注意:選擇Character類建立也能夠,它還默認引入了移動組件。不過,既然咱們想要本身動手實現移動,Pawn類已經足夠了。

關聯攝像機

攝像機是玩家觀察遊戲世界的方式。咱們要建立一個垂直視角觀察玩家角色的攝像機。

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

爲了建立攝像機,在Components面板點擊Add Component並選擇Camera

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

按下W鍵激活移動操做杆,將攝像機移動到(-1100, 0, 2000)。或者,你能夠在Location字段輸入座標點來移動攝像機。

若是攝像機被移出界面外,按下F鍵就能夠從新定位看到攝像機。

接着,按下E鍵激活旋轉操做杆,將攝像機沿Y軸旋轉-60度。

玩家表示

咱們用一個紅色方塊來表示玩家,因此須要使用Static Mesh組件進行展現。

首先,在Components面板左鍵點擊空白處取消選中Camera組件。不然,新加的組件會成爲攝像機的子節點。

點擊Add Component並選擇Static Mesh

爲了展現紅色方塊,選擇Static Mesh組件,隨後在Details頁籤Static Mesh屬性點擊下拉框,選擇SM_Cube

你在關卡場景裏應該就能看到以下畫面(若是看不到,你能夠在Viewport窗口按下F鍵聚焦畫面)

如今,是時候在關卡里動態生成玩家了。點擊Compile按鈕並回到主編輯器。

生成玩家

爲了讓玩家可以控制角色,你須要明確兩件事:

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

你能夠經過建立Game Mode類(遊戲模式類)來實現第一點。

建立遊戲模式

遊戲模式是一個類,用於控制玩家進入遊戲的方式。好比,在多人遊戲裏,可使用遊戲模式,決定每一個玩家在哪裏生成。更重要的是,遊戲模式決定了玩家使用哪一個角色。

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

從彈出窗口裏選擇Game Mode Base,並命名爲GM_Tutorial

如今,你須要指定哪一個Pawn做爲默認類。雙擊GM_Tutorial打開藍圖編輯器。

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

其次,關卡還須要知道當前使用哪一個遊戲模式。你能夠在World Settings裏指明這一點。點擊Compile並關閉藍圖編輯器。

每一個關卡都有本身的設置。你能夠經過Window\World Settings查看設置。一樣地,也能夠在Toolbar選擇Settings\World Settings進行查看。

Details頁籤旁邊就會出現World Settings頁籤。點擊該頁籤的GameMode Override字段,選擇GM_Tutorial

如今能夠看到Game Mode類已經修改爲GM_Tutorial

最後,咱們還須要指定玩家的生成位置。經過在關卡里放置Player Start(玩家出生點)便可。

放置玩家出生點

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

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

你能夠隨意放置玩家出生點。放好後,點擊Toolbar的Play按鈕。玩家就會在出生點生成。

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

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

設置輸入

將某個按鍵指定成觸發某個行爲,稱之爲按鍵綁定。

在Unreal裏,你能夠經過按鍵觸發event(事件)的方式來實現按鍵綁定。事件節點是一類當接收到特定行爲時,觸發執行的節點(好比在這個例子裏,當你按下綁定按鍵時,觸發執行某個事件節點)。當某個事件被觸發時,任何跟事件節點鏈接的節點就會被執行。

這種按鍵綁定的方式很是有好處,由於這意味着你不須要硬編碼按鍵對應的邏輯。

好比,你綁定了鼠標左鍵並命名爲Shoot事件。任何有射擊能力的Actor均可以使用Shoot事件,用於檢測玩傢什麼時候按下了鼠標左鍵。若是你想修改射擊對應綁定的按鍵,只要在輸入設置裏修改便可。

若是以硬編碼方式實現,你須要遍歷每一個Actor,分別修改射擊對應綁定的按鍵。

軸映射和操做映射

Edit\Project Settings裏能夠看到輸入設置。點擊Engine部分的Input選項進入設置界面。

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

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

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

在這篇教程裏,咱們會使用Axis Mapping

建立移動映射

首先,你須要建立兩組Axis Mapping。這樣就能夠實現多按鍵觸發同一個事件。

爲了建立一組新的Axis Mapping,點擊Axis Mappings右側的+號。建立兩組Axis Mapping,分別命名爲MoveForwardMoveRight

MoveForward負責先後移動。MoveRight負責左右移動。

咱們須要把移動映射到四個按鍵上:WASD。如今只有兩個插槽用於映射按鍵。經過點擊每組映射文本框右側的+號,添加映射插槽。

接着點擊每組插槽的下拉框,將WS鍵映射到MoveForwardAD鍵映射到MoveRight

接着,咱們須要設置Scale字段。

Axis Value和Input Scale

在你設置Scale字段前,咱們須要瞭解它是怎麼跟axis values搭配起做用的。

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

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

將Axis Value跟某個速度變量進行相乘,你就可以調整搖桿的速度。

你也能夠經過Axis Value判斷出方向。若是你將角色速度與一個Axis Value正數相乘,獲得的就是正數偏移。角色速度與一個Axis Value負數相乘,獲得的就是負數偏移。將偏移值與角色位置相加,就能知道角色往哪一個方向移動了。

因爲鍵盤按鍵只能輸出0或1的Axis Value,你可使用Scale來將其轉換成負數。經過Axis Value和Scale值相乘就能夠作到這點。

若是正數(Axis Value)和負數(Scale)相乘,按鍵輸出就是負數。

所以咱們點擊修改按鍵SAScale字段文本爲-1。

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

角色移動

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

添加MoveRight節點的步驟同上。

如今,咱們須要設置下MoveForward節點。

使用變量

爲了實現移動,咱們須要指定角色的運動速度。最簡單的方法是經過變量保存移動速度。

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

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

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

保持變量選中,在Details頁籤的Default Value區域,將MaxSpeed的默認值設爲10

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

咱們如今須要將MaxSpeedAxis Value相乘來得出最終移動速度和方向。添加float * float節點,並鏈接Axis ValueMaxSpeed

獲取角色朝向

爲了向前移動,首先須要知道角色的朝向。幸運地是,Unreal裏有這樣的節點。咱們須要添加Get Actor Forward Vector節點。

接着,添加Add Movement Input節點。該節點經過獲取方向和數值,將其轉換成移動偏移值。咱們按下圖鏈接各個節點:

白線表明節點執行順序。換言之,玩家進行操做,觸發相應事件並執行InputAxis MoveForward節點,隨後執行Add Movement Input節點。

Add Movement Input節點須要以下輸入:

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

MoveRight事件的設置步驟同上,除了要把Get Actor Forward Vector節點替換爲Get Actor Right Vector節點。試着不對照前面的操做指引,本身動手看看!

添加移動偏移

爲了讓角色真正動起來,咱們還須要將Add Movement Input節點計算得出的偏移值,累加到角色當前位置上。

基本上咱們的策略就是讓遊戲角色每幀移動一點點,因此咱們須要在Event Tick事件添加運動節點,每幀進行調用。

如今看看Event Graph有沒有Event Tick節點,它應該處於灰化狀態,若是沒有就建立對應節點。

爲了獲取偏移值,建立Consume Movement Input Vector節點。要累加偏移值到玩家角色上,還須要添加AddActorLocalOffset節點。隨後以下圖鏈接節點:

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

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

這裏有個小問題。高配機器有可能運行幀率更高。因爲Event Tick事件每幀調用,那同等時間內運動節點執行的次數更多。致使的結果就是高配機器角色移動得更快,反之亦然。

爲了不這個問題,角色運動必須是幀率無關的。

注意:我已經作了按鍵綁定用於展現幀率有關會產生的影響。按下數字鍵0將幀率調成60,按下數字鍵1將重置幀率。控制角色四處移動,看看不一樣幀率對移動速度的影響。

幀率無關

幀率無關意味着無論幀率是多少,相同時間的遊戲運行,會產生徹底一致的結果。幸運地是,在Unreal裏要作到這點很是容易。

退出遊戲,並打開BP_Player。接着,觀察Event Tick節點的Delta Seconds字段。

Delta Seconds爲當前幀的Event Tick調用與上一幀Event Tick調用的時間間隔。經過將偏移值與Delta Seconds相乘,角色運動就是幀率無關的。

好比,你的角色最高速度是100。若是距離上一幀Event Tick已通過了1秒,則角色移動100個單元。若是隻過了0.5秒,則角色運動50個單元。

若是角色運動是幀率相關的,那就會產生不過幀率高低,每幀固定移動100單元的結果。

爲了將偏移值與Delta Seconds相乘,添加vector * float節點。以後,以下圖進行連線:

因爲每幀間隔時間很短,角色移動起來會很慢,因此能夠將MaxSpeed的默認值調大至600

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

你可能注意到了,方塊如今會穿透其餘物體。爲了解決這個問題,咱們須要用上碰撞檢測

角色碰撞

爲了可以互相碰撞,角色須要一個表明其碰撞區域(一般稱之爲碰撞體)的東西。你可使用如下任一種:

  • Collision mesh(碰撞網格):這個一般在網格導入時就會生成(若是你勾選了容許)。用戶也能夠用3D軟件建立自定義碰撞網格。紅色方塊導入時就自動生成了碰撞網格。
  • Collision component(碰撞組件):通常由三種形狀:盒子,膠囊體和球體。你能夠經過Components面板進行添加。一般用於簡單碰撞。

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

當一個碰撞體碰到了另個碰撞體,碰撞就產生了。

設置碰撞

你可能會奇怪,方塊有碰撞體,卻沒有檢測到碰撞。當你移動方塊時,Unreal只認爲方塊的根組件可產生碰撞。因爲方塊的根組件並無任何碰撞體,因此就穿透了其餘物體。

注意:一個root組件沒有碰撞體的角色,一樣能夠擋住其餘角色。但若是你移動這個角色,它是不會與任何物體產生碰撞的。

因此,爲了使用碰撞網格,StaticMesh必須做爲根組件存在。咱們經過在Components面板左鍵拖拽StaticMesh至DefaultSceneRoot。釋放鼠標,StaticMesh如今就成了根組件了。

最後還要作一件事情。切換到Event Graph頁籤,將AddActorLocalOffset節點的Sweep輸入勾選爲true

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

回到主編輯器並點擊Play。如今方塊能與關卡場景產生碰撞了!

建立道具

任何東西都能成爲供玩家觸碰拾取的道具。這裏咱們使用BP_Banana做爲道具。

爲了檢測方塊是否碰到了道具,咱們須要一個在產生碰撞時,觸發執行的事件節點。咱們可使用碰撞響應來生成事件。

碰撞響應也決定了角色之間的碰撞後行爲。有如下三類碰撞響應:IgnoreOverlapBlock。如下是它們互相之間的做用結果:

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

設置碰撞響應

退出遊戲並打開BP_Banana。選擇StaticMesh組件並觀察Details面板,Collision部分能夠設置碰撞響應。

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

如今,你須要指定道具和方塊之間的碰撞響應。

組件有一項屬性稱之爲對象類型。對象類型是一種給角色進行簡單分類的方法。你能夠在這裏瞭解更多關於對象類型的內容。

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

碰撞處理

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

Event Graph界面就會出現OnComponentBeginOverlap (StaticMesh)節點。

最後,添加DestroyActor節點,並鏈接OnComponentBeginOverlap (StaticMesh)節點。顧名思義,該節點會將目標角色從遊戲中移除。因爲咱們沒有顯式指定Target,因此它會銷燬調用該節點的角色。

放置道具

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

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

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

後續學習

你能夠在這裏下載完整項目

你如今距離成爲Unreal Engine專家又近了一步了。但願這篇教程沒有難倒你。

若是你還想繼續學習Unreal Engine 4引擎,點擊下篇教程,我會進一步講解Unreal Engine 4引擎的材質系統。

相關文章
相關標籤/搜索