原文: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按鈕並回到主編輯器。
爲了讓玩家可以控制角色,你須要明確兩件事:
你能夠經過建立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提供了兩類按鍵綁定方法:
在這篇教程裏,咱們會使用Axis Mapping。
首先,你須要建立兩組Axis Mapping。這樣就能夠實現多按鍵觸發同一個事件。
爲了建立一組新的Axis Mapping,點擊Axis Mappings右側的+號。建立兩組Axis Mapping,分別命名爲MoveForward和MoveRight。
MoveForward負責先後移動。MoveRight負責左右移動。
咱們須要把移動映射到四個按鍵上:W,A,S和D。如今只有兩個插槽用於映射按鍵。經過點擊每組映射文本框右側的+號,添加映射插槽。
接着點擊每組插槽的下拉框,將W和S鍵映射到MoveForward,A和D鍵映射到MoveRight。
接着,咱們須要設置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)相乘,按鍵輸出就是負數。
所以咱們點擊修改按鍵S和A的Scale字段文本爲-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。
咱們如今須要將MaxSpeed與Axis Value相乘來得出最終移動速度和方向。添加float * float節點,並鏈接Axis Value和MaxSpeed。
爲了向前移動,首先須要知道角色的朝向。幸運地是,Unreal裏有這樣的節點。咱們須要添加Get Actor Forward Vector節點。
接着,添加Add Movement Input節點。該節點經過獲取方向和數值,將其轉換成移動偏移值。咱們按下圖鏈接各個節點:
白線表明節點執行順序。換言之,玩家進行操做,觸發相應事件並執行InputAxis MoveForward節點,隨後執行Add Movement Input節點。
Add Movement Input節點須要以下輸入:
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。
至此恭喜你,成功解鎖了幀率無關成就!
你可能注意到了,方塊如今會穿透其餘物體。爲了解決這個問題,咱們須要用上碰撞檢測。
爲了可以互相碰撞,角色須要一個表明其碰撞區域(一般稱之爲碰撞體)的東西。你可使用如下任一種:
下面就是一我的物和其碰撞體的例子。
當一個碰撞體碰到了另個碰撞體,碰撞就產生了。
你可能會奇怪,方塊有碰撞體,卻沒有檢測到碰撞。當你移動方塊時,Unreal只認爲方塊的根組件可產生碰撞。因爲方塊的根組件並無任何碰撞體,因此就穿透了其餘物體。
注意:一個root組件沒有碰撞體的角色,一樣能夠擋住其餘角色。但若是你移動這個角色,它是不會與任何物體產生碰撞的。
因此,爲了使用碰撞網格,StaticMesh必須做爲根組件存在。咱們經過在Components面板左鍵拖拽StaticMesh至DefaultSceneRoot。釋放鼠標,StaticMesh如今就成了根組件了。
最後還要作一件事情。切換到Event Graph頁籤,將AddActorLocalOffset節點的Sweep輸入勾選爲true。
簡單來說,AddActorLocalOffset會將角色從舊位置瞬移到新位置上。Sweep能夠確保舊位置和新位置之間的物體都能與角色進行碰撞檢測。
回到主編輯器並點擊Play。如今方塊能與關卡場景產生碰撞了!
任何東西都能成爲供玩家觸碰拾取的道具。這裏咱們使用BP_Banana做爲道具。
爲了檢測方塊是否碰到了道具,咱們須要一個在產生碰撞時,觸發執行的事件節點。咱們可使用碰撞響應來生成事件。
碰撞響應也決定了角色之間的碰撞後行爲。有如下三類碰撞響應:Ignore,Overlap和Block。如下是它們互相之間的做用結果:
雖然可使用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引擎的材質系統。