原文:How to Create a Simple FPS in Unreal Engine 4
作者:Tommy Tran
譯者:Shuchang Liu
在本篇教程中,將學(xué)習(xí)創(chuàng)建一個(gè)簡(jiǎn)單的第一人稱視角射擊游戲。你將學(xué)會(huì)如何創(chuàng)建一個(gè)持槍的第一人稱角色,并實(shí)現(xiàn)射擊其他Actor。
第一人稱視角射擊游戲(FPS)是一類玩家以游戲角色視角進(jìn)行射擊體驗(yàn)的游戲。FPS游戲非常熱門,不乏使命召喚和戰(zhàn)地等大作。
Unreal引擎最開始就是為FPS游戲量身打造的引擎,所以用Unreal引擎制作FPS游戲也是理所當(dāng)然的事。在本篇教程中,你將學(xué)會(huì):
創(chuàng)建能夠四處移動(dòng)的第一人稱角色
創(chuàng)建一把槍,綁定在角色身上
使用直線追蹤(大家熟知的射線追蹤)發(fā)射子彈
-
對(duì)Actor扣除傷害
注意:本篇教程只是Unreal Engine 4系列教程的其中一篇:
- Part 1:入門
- Part 2:藍(lán)圖
- Part 3:材質(zhì)
- Part 4:UI
- Part 5:制作簡(jiǎn)單游戲
- Part 6:動(dòng)畫
- Part 7:音頻
- Part 8:粒子系統(tǒng)
- Part 9:AI
- Part 10:制作簡(jiǎn)單FPS游戲
起步入門
下載示例項(xiàng)目并解壓。進(jìn)入項(xiàng)目文件夾,雙擊BlockBreaker.uproject打開項(xiàng)目,我們能看到以下場(chǎng)景:

綠色墻上包含著多個(gè)目標(biāo),當(dāng)目標(biāo)受到傷害時(shí)會(huì)變紅。一旦血量值降為零,目標(biāo)就會(huì)消失。紅色按鈕可以重置所有的目標(biāo)。
首先,我們要?jiǎng)?chuàng)建玩家角色。
創(chuàng)建玩家角色
打開Blueprints文件夾并創(chuàng)建一個(gè)新的Blueprint Class類,選擇Character作為父類,并將其命名為BP_Player。

Character本身是Pawn的一種,額外多了一些其他功能,比如CharacterMovement組件。

該組件會(huì)自動(dòng)處理如走動(dòng)跑跳等移動(dòng)功能,我們只要簡(jiǎn)單調(diào)用對(duì)應(yīng)函數(shù)就可以移動(dòng)角色。我們也可以在該組件設(shè)置走路速度,起跳速度等變量。
在實(shí)現(xiàn)移動(dòng)功能前,Character需要知道玩家的按鍵情況,因?yàn)槲覀兿葘⒁苿?dòng)映射到W,A,S和D鍵上。
注意:如果你還不熟悉關(guān)于鍵位映射的有關(guān)內(nèi)容,請(qǐng)查看藍(lán)圖教程。鍵位映射是一種定義鍵位執(zhí)行特定行為的方法。
創(chuàng)建移動(dòng)映射
選擇Edit\Project Settings,打開Input設(shè)置。
創(chuàng)建兩個(gè)名為MoveForward和MoveRight的軸映射。MoveForward控制前后移動(dòng),MoveRight控制左右移動(dòng)。

對(duì)于MoveForward,將按鍵改為W,隨后,創(chuàng)建多一個(gè)鍵位插槽,將其設(shè)置為S,并將Scale改為-1.0。

隨后,我們會(huì)將Scale值跟角色朝向向量相乘,當(dāng)Scale值是正數(shù)時(shí),向量方向朝前,當(dāng)Scale值是負(fù)數(shù)時(shí),向量方向朝后。通過得出的向量結(jié)果,我們就可以讓角色朝前朝后移動(dòng)了。

接著,我們要對(duì)左右移動(dòng)做同樣的設(shè)置,將MoveRight設(shè)為D,新建鍵位插槽設(shè)為A,Scale值設(shè)為-1.0。

現(xiàn)在我們?cè)O(shè)置好了鍵位映射,就可以用它們來進(jìn)行移動(dòng)了。
實(shí)現(xiàn)移動(dòng)
打開BP_Player并打開Event Graph,添加MoveForward事件節(jié)點(diǎn)(在Axis Events分類下)。即使沒有按任何按鍵,該事件也會(huì)每幀調(diào)用。

該事件會(huì)輸出Axis Value,也即剛才所設(shè)置的Scale值。當(dāng)按下W時(shí),輸出1,當(dāng)按下S時(shí),輸出-1。如果不按任何按鍵,輸出0。
接著,我們要讓角色進(jìn)行移動(dòng),添加Add Movement Input,進(jìn)行如下連接:

Add Movement Input節(jié)點(diǎn)會(huì)用一個(gè)向量與Scale Value字段相乘,這樣就能將向量轉(zhuǎn)換到對(duì)應(yīng)方向。由于我們用了Character類,CharacterMovement組件會(huì)將Pawn往對(duì)應(yīng)方向移動(dòng)向量距離。
現(xiàn)在,我們需要指定移動(dòng)方向。我們希望角色往正面朝向移動(dòng),所以可以使用Get Actor Forward Vector節(jié)點(diǎn),該節(jié)點(diǎn)返回一個(gè)正面朝向向量,創(chuàng)建節(jié)點(diǎn)如圖下一樣連接:

小結(jié):
- MoveForward節(jié)點(diǎn)會(huì)每幀輸出Axis Value,當(dāng)按下W時(shí)輸出1,當(dāng)按下S時(shí)輸出-1,什么都不按,輸出0
- Add Movement Input節(jié)點(diǎn)將玩家朝向向量與Scale Value相乘,使得不同按鍵控制輸出不同方向的向量。什么都不按,意味著向量并沒有方向,角色原地不動(dòng)
- CharacterMovement組件獲得Add Movement Input節(jié)點(diǎn)的輸出,驅(qū)動(dòng)角色朝指定方向移動(dòng)
MoveRight按以上步驟操作,不過記得將Get Actor Forward Vector節(jié)點(diǎn)改為Get Actor Right Vector節(jié)點(diǎn)。

在測(cè)試移動(dòng)功能前,我們還要設(shè)置下Game Mode里的默認(rèn)Pawn。
設(shè)置默認(rèn)Pawn
點(diǎn)擊Compile并回到主編輯器,打開World Settings面板并找到Game Mode設(shè)置,將Default Pawn Class改為BP_Player。

注意:如果你的主編輯器面板還沒有World Settings面板,在Toolbar選擇Settings\World Settings調(diào)出面板。
現(xiàn)在運(yùn)行游戲你就能控制BP_Player了,按下Play并使用W,S,A和D來進(jìn)行移動(dòng)。

我們接著創(chuàng)建輸入映射來觀察四周。
創(chuàng)建觀察映射
打開Project Settings,再創(chuàng)建兩個(gè)軸映射,分別命名為LookHorizontal和LookVertical。

將LookHorizontal的鍵位改為Mouse X。

這樣當(dāng)鼠標(biāo)向右滑動(dòng)時(shí)會(huì)輸出正數(shù),反之亦然。
接著,將LookVertical的鍵位改為Mouse Y。

這樣當(dāng)鼠標(biāo)向上滑動(dòng)時(shí)會(huì)輸出正數(shù),反之亦然。
現(xiàn)在,我們要寫點(diǎn)邏輯來實(shí)現(xiàn)轉(zhuǎn)動(dòng)視角。
實(shí)現(xiàn)轉(zhuǎn)動(dòng)視角
如果一個(gè)Pawn上沒有Camera組件,Unreal會(huì)自動(dòng)為你創(chuàng)建一個(gè)攝像機(jī)。默認(rèn)情況下,攝像機(jī)會(huì)使用控制器的旋轉(zhuǎn)。
注意:如果你想了解更多關(guān)于控制器的內(nèi)容,可以查看AI部分教程。
雖然控制器并沒有物理實(shí)體,它仍舊有自己的旋轉(zhuǎn)。這意味著我們可以讓角色和攝像機(jī)面向不同方向。比如,在第三人稱游戲里,角色和攝像機(jī)并不總是處于同一方向。

要在第一人稱視角里轉(zhuǎn)動(dòng)攝像機(jī),我們所要做的就是修改控制器的旋轉(zhuǎn)。
打開BP_Player并創(chuàng)建LookHorizontal事件。

要讓攝像機(jī)看向左邊或右邊,我們需要調(diào)整控制器的偏航角(Yaw),創(chuàng)建Add Controller Yaw Input節(jié)點(diǎn)并進(jìn)行如下連接:

現(xiàn)在,當(dāng)你水平移動(dòng)鼠標(biāo)時(shí),控制器會(huì)向左或向右轉(zhuǎn)動(dòng),由于攝像機(jī)使用了控制器的旋轉(zhuǎn),攝像機(jī)也會(huì)跟著轉(zhuǎn)動(dòng)。
重復(fù)以上步驟實(shí)現(xiàn)LookVertical,不過記得將Add Controller Yaw Input改為Add Controller Pitch Input節(jié)點(diǎn)。

如果我們現(xiàn)在就運(yùn)行測(cè)試游戲,會(huì)發(fā)現(xiàn)上下轉(zhuǎn)動(dòng)的反轉(zhuǎn)的,也就是說,當(dāng)我們鼠標(biāo)向上滑動(dòng),攝像機(jī)是向下轉(zhuǎn)動(dòng)的。
如果想改成非反轉(zhuǎn)控制,將Axis Value剩余-1,這樣就能對(duì)Axis Value取反,控制器的轉(zhuǎn)動(dòng)也會(huì)反轉(zhuǎn)過來。

點(diǎn)擊Compile并按下Play運(yùn)行游戲,使用鼠標(biāo)來轉(zhuǎn)動(dòng)視角吧。

現(xiàn)在移動(dòng)和視角轉(zhuǎn)動(dòng)都實(shí)現(xiàn)了,是時(shí)候搞把槍了!
創(chuàng)建槍支
你還記得當(dāng)創(chuàng)建藍(lán)圖類時(shí),我們可以指定一個(gè)父類吧?好吧,其實(shí)也可以指定自己的藍(lán)圖類作為父類。當(dāng)我們有多個(gè)不同類型的物體,擁有同樣的函數(shù)或?qū)傩詴r(shí),就會(huì)發(fā)現(xiàn)很有用處。
舉例來說,當(dāng)我們有多種類型的汽車。我們可以創(chuàng)建一個(gè)Car類,包含比如速度和顏色等變量。然后可以再創(chuàng)建其他類(子類),使用Car類作為父類。每個(gè)子類都會(huì)包含同樣的變量?,F(xiàn)在我們就能輕易地創(chuàng)建不同速度和顏色變量的汽車了。

我們可以使用相同方式來創(chuàng)建槍支。因?yàn)槲覀兪紫纫獎(jiǎng)?chuàng)建一個(gè)基類。
創(chuàng)建槍支基類
回到主編輯器并創(chuàng)建Actor類型的Blueprint Class,將其命名為BP_BaseGun并打開。
接著,我們要?jiǎng)?chuàng)建一些定義槍械參數(shù)的變量,創(chuàng)建如下float類型變量:
- MaxBulletDistance:子彈最遠(yuǎn)飛行距離
- Damage:子彈傷害
- FireRate:子彈發(fā)射間隔(秒)

注意:每個(gè)變量的默認(rèn)值都是0,對(duì)本例來說沒什么問題。然而,如果你希望新的槍支類有別的默認(rèn)值,你需要在BP_BaseGun設(shè)置下。
現(xiàn)在,我們需要給槍支一個(gè)物理外觀,添加Static Mesh組件并命名為GunMesh。

先別急著給Static Mesh組件設(shè)置網(wǎng)格,我們會(huì)在創(chuàng)建槍械子類時(shí)再做這件事。
創(chuàng)建槍械子類
點(diǎn)擊Compile并返回主編輯器。要?jiǎng)?chuàng)建子類,我們要在右鍵點(diǎn)擊BP_BaseGun,從彈出菜單選中Create Child Blueprint Class。

將其命名為BP_Rifle并雙擊打開,然后打開Class Default設(shè)置以下變量:
- MaxBulletDistance: 5000
- Damage: 2
- FireRate: 0.1

這意味著每顆子彈能最遠(yuǎn)飛行5000單位的距離。如果子彈命中Actor,能對(duì)其造成2點(diǎn)傷害。當(dāng)持續(xù)開火射擊時(shí),射擊間隔不少于0.1秒。
接著,我們需要指定這把槍的網(wǎng)格,選中GunMesh組件,并將其Static Mesh設(shè)置為SM_Rifle。

這把槍現(xiàn)在就完成了,點(diǎn)擊Compile并關(guān)閉BP_Rifle。
接著,我們要?jiǎng)?chuàng)建自己的攝像機(jī)組件了。這樣能夠更好地控制攝像機(jī)位置,我們還可以將槍支跟攝像機(jī)綁定在一起,這樣槍支就能始終保持在攝像機(jī)的正面了。
創(chuàng)建攝像機(jī)
打開BP_Player并創(chuàng)建攝像機(jī)組件,將其命名為FpsCamera。

攝像機(jī)的默認(rèn)位置有點(diǎn)偏低,會(huì)讓玩家感覺太矮,將FpsCamera的位置改為(0, 0, 90)。

默認(rèn)情況下,攝像機(jī)組件并不使用控制器的旋轉(zhuǎn)。要修正這點(diǎn),在Details面板啟用Camera Settings\Use Pawn Control Rotation。

接著,我們需要定義槍支的位置。
定義槍支位置
要定義槍支位置,我們可以使用Scene組件。這個(gè)組件非常適合用來定義位置,因?yàn)樗话粋€(gè)Transform。首先確保選中了FpsCamera,然后再創(chuàng)建Scene組件,組件就會(huì)附著在攝像機(jī)節(jié)點(diǎn)下,將組件命名為GunLocation。

通過在FpsCamera放置GunLocation,槍支就會(huì)相對(duì)于攝像機(jī)保持同一位置,這樣槍支就能始終保持在鏡頭前方。
接著,將GunLocation的位置改為(30, 14, -12),讓其處于相對(duì)攝像機(jī)靠前一側(cè)位置。

隨后,將旋轉(zhuǎn)設(shè)為(0, 0, -95)。當(dāng)槍支在這個(gè)位置時(shí),看起來就像在瞄準(zhǔn)屏幕中間。

現(xiàn)在,我們需要生成槍支并將其綁定在GunLocation位置上。
生成并綁定槍支
找到Event BeginPlay并創(chuàng)建Spawn Actor From Class節(jié)點(diǎn),將Class設(shè)為BP_Rifle。

由于我們需要用到槍支,先創(chuàng)建變量存儲(chǔ)其引用。創(chuàng)建BP_BaseGun類型變量,將其命名為EquippedGun。
這里要注意新建變量不要設(shè)為BP_Rifle類型的,因?yàn)橥婕覒?yīng)該能夠使用各種類型的槍支,而不單只是來福槍,否則如果生成了其他種類的槍支,就不能存儲(chǔ)在BP_Rifle類型變量上了。
接著,將Spawn Actor From Class的Return Value引腳設(shè)為EquippedGun。

要綁定槍支的位置,我們需要用上AttachToComponent組件。創(chuàng)建組件并將Location Rule和Rotation Rule設(shè)為Snap to Target。這樣就能讓槍支擁有跟其父類一樣的位置和旋轉(zhuǎn)。

接著,創(chuàng)建GunLocation引用并進(jìn)行如下連線:

小結(jié):
- 當(dāng)BP_Player生成時(shí),它會(huì)連帶生成BP_Rifle實(shí)例
- EquippedGun字段會(huì)持有BP_Rifle引用
- AttachToComponent節(jié)點(diǎn)會(huì)將槍支設(shè)置在GunLocation位置。
點(diǎn)擊Compile并按下Play運(yùn)行游戲?,F(xiàn)在當(dāng)玩家生成時(shí),槍支也會(huì)一同生成,顯示在攝像機(jī)的前面。

現(xiàn)在有趣的地方來了:射擊子彈!要檢測(cè)子彈是否打中東西,我們要用上射線檢測(cè)(line trace)。
射擊子彈
射線檢測(cè)是一個(gè)包含開始點(diǎn)和結(jié)束點(diǎn)(兩點(diǎn)成線)的函數(shù),它會(huì)檢測(cè)這條線上的每個(gè)點(diǎn),看是否碰到其他物體。在游戲中,這是用于檢測(cè)子彈是否打中東西的最普遍做法。
由于射擊是屬于槍支的特性,射擊函數(shù)應(yīng)該設(shè)計(jì)在槍支類里,而不是角色類。打開BP_BaseGun并創(chuàng)建名為Shoot的函數(shù)。
隨后,創(chuàng)建兩個(gè)Vector輸入,分別命名為StartLocation和EndLocation。它們分別為射線檢測(cè)的開始點(diǎn)和結(jié)束點(diǎn)(通過BP_Player傳入)。

我們可以使用LineTraceByChannel節(jié)點(diǎn)來執(zhí)行射線檢測(cè)。這個(gè)節(jié)點(diǎn)會(huì)使用可視力(Visibility)或者攝像機(jī)(Camera)碰撞通道來進(jìn)行碰撞檢測(cè)。創(chuàng)建節(jié)點(diǎn),進(jìn)行如下連線:

接著,我們需要檢測(cè)射線是否碰撞到任何東西。創(chuàng)建Branch并進(jìn)行如下連線:

如果檢測(cè)到碰撞,Return Value會(huì)輸出true,反之亦然。
為了在子彈擊中物體時(shí)給予玩家視覺反饋,我們可以使用粒子特效。
生成子彈撞擊粒子
首先,我們需要獲得射線碰撞的位置。拖拽Out Hit引腳到圖表空白處,從彈出菜單中,選擇Break Hit Result。

這樣我們能得到一個(gè)跟射線檢測(cè)結(jié)果相關(guān)的,具有多種引腳的節(jié)點(diǎn)。
創(chuàng)建Spawn Emitter at Location節(jié)點(diǎn),并將Emitter Template設(shè)為PS_BulletImpact。隨后,連接其Location與Break Hit Result的Location。

以下是目前的函數(shù)連線:

小結(jié):
- 當(dāng)Shoot函數(shù)執(zhí)行時(shí),它首先會(huì)執(zhí)行一個(gè)射線檢測(cè)
- 如果檢測(cè)到碰撞,Spawn Emitter at Location節(jié)點(diǎn)會(huì)在碰撞位置生成粒子特效PS_BulletImpact。
現(xiàn)在射擊邏輯已經(jīng)完成了,再寫下調(diào)用邏輯即可。
調(diào)用射擊函數(shù)
首先,我們需要?jiǎng)?chuàng)建射擊的按鍵映射。點(diǎn)擊Compile并打開Project Settings。創(chuàng)建一個(gè)新的Axis Mapping并命名為Shoot,將其按鍵設(shè)為Left Mouse Button,然后關(guān)閉Project Settings。

隨后,打開BP_Player并創(chuàng)建Shoot事件。

為了檢測(cè)玩家是否按下Shoot鍵,我們需要檢測(cè)Axis Value是否等于1。創(chuàng)建如下高亮節(jié)點(diǎn):

接著,創(chuàng)建EquippedGun引用節(jié)點(diǎn),并調(diào)用它的Shoot函數(shù)。

現(xiàn)在,我們需要計(jì)算下射線檢測(cè)的起始點(diǎn)和結(jié)束點(diǎn)。
計(jì)算射線檢測(cè)的位置
在很多FPS游戲里,子彈其實(shí)是從攝像機(jī)而不是從槍里發(fā)射出來的,這是因?yàn)閿z像機(jī)天然就是對(duì)準(zhǔn)射擊準(zhǔn)心的。所以如果從攝像機(jī)發(fā)射子彈,就可以保證其一定會(huì)往準(zhǔn)心飛行。
注意:也有些游戲確實(shí)是從槍里發(fā)射子彈的。然而,它要求一些額外計(jì)算來保證子彈向準(zhǔn)心方向射擊。
創(chuàng)建FpsCamera引用并將其與GetWorldLocation連接。

現(xiàn)在我們還需要結(jié)束點(diǎn)位置。記得槍支有個(gè)MaxBulletDistance變量吧,這意味著結(jié)束點(diǎn)位置應(yīng)該在距離攝像機(jī)MaxBulletDistance單位遠(yuǎn)的地方。因此要計(jì)算出結(jié)束點(diǎn)位置,添加如下高亮節(jié)點(diǎn):

隨后,像下圖一樣連接所有節(jié)點(diǎn):

小結(jié):
- 當(dāng)玩家按下或按住鼠標(biāo)左鍵時(shí),槍支會(huì)從攝像機(jī)處開始發(fā)射子彈。
- 子彈會(huì)向前飛行MaxBulletDistance距離
點(diǎn)擊Compile并按下Play運(yùn)行游戲,按住鼠標(biāo)左鍵開始發(fā)射子彈吧!

現(xiàn)在,槍支是每幀都在射擊的,射速實(shí)在是有點(diǎn)太快了,所以下一步要降低槍支的開火速度。
降低開火速度
首先,我們需要一個(gè)變量檢測(cè)玩家是否正在射擊。打開BP_Player創(chuàng)建boolean類型變量,命名為CanShoot,將其默認(rèn)值設(shè)為true。如果CanShoot等于true,說明玩家正在射擊。
下面將Branch部分圖表改成下圖:

現(xiàn)在,玩家只有在按下Shoot鍵且CanShoot等于true時(shí)才能進(jìn)行射擊了。
接著,添加如下高亮節(jié)點(diǎn):

調(diào)整修改小結(jié):
- 玩家只有在按住鼠標(biāo)左鍵且CanShoot等于true時(shí)才能進(jìn)行射擊
- 一旦玩家射出一顆子彈,CanShoot就會(huì)設(shè)為false,防止馬上射出第二顆子彈
- CanShoot會(huì)在隔FireRate秒時(shí)間后重置為true
點(diǎn)擊Compile并關(guān)閉BP_Player,按下Play運(yùn)行游戲測(cè)試下槍支的射速吧!

實(shí)現(xiàn)受擊
在Unreal里,每個(gè)Actor都能受擊。然而,Actor要對(duì)受擊傷害做出什么處理是可以自由定義的。
比如,當(dāng)戰(zhàn)斗中的游戲角色當(dāng)受擊時(shí),會(huì)扣除血量。然而,像氣球一類物體是沒有血量概念的。取而代之的,我們會(huì)編寫邏輯讓氣球在受擊時(shí)爆炸。
在我們處理Actor受擊時(shí),我們首先要施加一個(gè)“傷害”。打開BP_BaseGun并在Shoot函數(shù)后添加Apply Damage節(jié)點(diǎn)。

接著,我們需要指定要施加傷害的Actor,在本例中,就是射線檢測(cè)到的Actor。連接Damaged Actor與Break Hit Result的Hit Actor引腳。

最后,我們需要指定要受擊傷害數(shù)值,創(chuàng)建Damage變量引用,并與Base Damage相連。

現(xiàn)在,當(dāng)我們調(diào)用Shoot函數(shù)時(shí),它就會(huì)對(duì)射線檢測(cè)到的物體進(jìn)行傷害。點(diǎn)擊Compile并關(guān)閉BP_BaseGun。
現(xiàn)在我們需要處理每種Actor對(duì)于受擊傷害的反饋。
處理受擊
首先,我們需要處理目標(biāo)獲得傷害數(shù)據(jù),打開BP_Target并創(chuàng)建Event AnyDamage事件節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)會(huì)在受到傷害且其數(shù)值不為零時(shí)觸發(fā)執(zhí)行。

隨后,調(diào)用TakeDamage函數(shù)并連接Damage引腳。這個(gè)函數(shù)會(huì)將目標(biāo)的Health變量減去Damage數(shù)值,并更新目標(biāo)的顏色。

現(xiàn)在,當(dāng)目標(biāo)受到傷害時(shí),它就會(huì)扣除血量了。點(diǎn)擊Compile并關(guān)閉BP_Target。
接著,我們需要處理按鈕對(duì)傷害的反饋。打開BP_ResetButton并創(chuàng)建Event AnyDamage。隨后,調(diào)用ResetTargets函數(shù)。

這個(gè)函數(shù)會(huì)在按鈕受擊時(shí)調(diào)用并重置所有目標(biāo)的狀態(tài)。點(diǎn)擊Compile并關(guān)閉BP_ResetButton。
按下Play運(yùn)行游戲開始射擊目標(biāo)。如果你想要重置所有目標(biāo),就朝按鈕射擊。

后續(xù)學(xué)習(xí)
你可以在這里下載完整項(xiàng)目。
雖然本篇教程中所制作是一個(gè)非常簡(jiǎn)單的FPS游戲,你可以在此基礎(chǔ)上進(jìn)一步擴(kuò)展,試著創(chuàng)建更多具有不用射速和傷害的槍械,也可以嘗試添加裝彈功能!
以上就是Unreal Engine 4 系列教程的全部?jī)?nèi)容了。不過別擔(dān)心,我們后續(xù)還會(huì)制作更多關(guān)于Unreal Engine 4的教程?,F(xiàn)在我們開始在招募新的Unreal Engine教程團(tuán)隊(duì)了,希望可以為社區(qū)帶來更多精彩的Unreal Engine系列教程。希望到時(shí)可以看到你們的身影!:]