UE4 Game Jam 敵人鎖定系統

星期五 10 May 2019   even  
遊戲開發 教學

前言

敵人鎖定系統是所有動作遊戲幾乎必備的系統,讓玩家操控的角色可以更方便的攻擊到敵人,而不用努力的設法旋轉角色的身體,使其正面面對敵人,才能觸發正確的攻擊判定。

難以想像的,在我game jam期間稍微嘗試一下,就讓我寫出敵人鎖定系統,因此特別寫個簡短的教學說明我是怎麼做出來的。

影片demo:

在鎖定敵人後,角色會一直面向敵人,如此讓玩家的攻擊可以更簡便的命中怪物。

這只是一個在gam jam中做出的雛型,實際要做的話應該還要考慮很多東西。

Pseudo Code

(1) 設定鎖定敵人的輸入按鍵。

(2) 按下之後,檢查在某某範圍內是否有敵人。

(3) 如果有,則在離自己最近的敵人身上顯示出正在鎖定的視覺效果。

(4) 如果現在正在鎖定,當玩家再次按下鎖定時,將鎖定目標切換至另一個離自己最近的目標。

(5) 鎖定期間,強制固定角色的模型的旋轉(Yaw軸),使其一直面對敵人。

(6) 如果鎖定的敵人距離自己過遠,則取消鎖定狀態,讓角色的旋轉恢復原樣。

上面的(4)、(5)是值得再仔細設想的,各遊戲都有不同的操作方式來切換鎖定,解除鎖定,我只是很快地建立這樣的系統,沒有時間去思索哪種系統比較好。

另外,鎖定期間,角色的移動動畫應該要改成8-direction的移動方式,例如向左或向右移動時,應該要切換成撥放向左、右走的動畫。攝影機的聚焦、位移等,也要考慮怎麼設計、調整,這些都是我在這次game jam中沒有添加,但正式遊戲中需要顧慮的細節。

Blueprint

之後會改寫C++放到我的正式專案中,在Game Jam時我沒時間改寫,所以這份教學會以BP介紹我是怎麼做的。

(1) 首先設定輸入,Edit-> Editor Preference-> Input,新增一個ActionBinding,我命名為LockEnemy,按鍵設置在滑鼠右鍵。

(2)、(3)、(4) 檢查某某範圍內是否有敵人,如果有,則在離自己最近的敵人身上顯示出正在鎖定的視覺效果。

先在我的EnemyBP底下,新增一個component(我使用static mesh,把collision關掉)做為正在被鎖定的視覺效果(FocusHint),只要我鎖定,就將這個instance的FocusHint的visibility打開,取消鎖定就將它關掉。

FocusHint就是下圖骷髏怪底下的紅色圈圈。

因為鎖定系統需要大量使用哪個敵人、距離多遠,這兩個種類型的變數,因此我先新增了一個struct,命名為EnemyToFocus,讓我的程式之後比較好處理。

在content browser中,Add new -> Blueprint-> Structure,然後新增一個float和一個Enemy如下:

現在回到主角的BP中,新增兩個global變數,CurrentFocusedEnemy (reference of Enemy instance)、RangeCanFocus (Float),新增三個function,Set Focused Enemy、Set Unfocused Enemy、ForceRotationToFocused。

按下鎖定敵人後,執行Set Focused Enemy這個function,因為這段邏輯比較複雜,因此寫成一個function,Input為RangeCanFocus,Output為一個bool,表示有沒有成功鎖定到敵人。

Set Focused Enemy是依以下的邏輯建立:

新增3個local變數,EnemiesToFocus (array of EnemyToFocus)、Min (float)、 Old Focus (reference of Enemy instance)

分成三個階段,

  • 檢查RangeCanFocus距離內是否有敵人,有的話將他們加到EnemiesToFocus中,沒有的話直接return false,結束這個function。
  • 檢查現在有沒有鎖定敵人,有的話則將現在鎖定的敵人設為 Old Focus,將距離最近且不是Old Focus的敵人設為CurrentFocusedEnemy,return true。
  • 同上,如果現在沒有鎖定敵人,則直接將最近的敵人設為CurrentFocusedEnemy,return true。

有鎖定到敵人的話,同時把那個敵人的FocusHint設為visible。

如下:

我都是迴圈來檢查距離,一開始使用的是get all actor of class,將class設為我的enemy,如此會把現在遊戲中所有的enemy放進這個迴圈裡去跑。

多設立Min這個local變數是為了比較距離自己最近的敵人是哪一個。我將上面的BP再放大一些,方便你們看。

執行完Set Focused Enemy後,需要再把所有不是CurrentFocusedEnemy的敵人的FocusHint設為invisible,如果這裡使用的Set Unfocused Enemy這個function:

(5)、(6) 在Tick中檢查現在CurrentFocusedEnemy是否valid,在檢查距離是否過遠,過遠則將CurrentFocusedEnemy設為Null,並將他的FocusHint設為invisible。

如果CurrentFocusedEnemy 不為null,且在距離內,則執行ForceRotationToFocused,強制鎖定主角人物的旋轉,如下:

OK~ 我們這樣子就完成了敵人鎖定系統~

2019 UE4 Spring Game Jam 開發心得
UE4 Game Jam 經驗談
UE4 Game Jam 遊戲企畫與開發日誌
UE4 Game Jam 難題排除
UE4 Game Jam 建構有車子的街道
UE4 Game Jam 敵人鎖定系統

相關文章:

>