淺談環繞移動型 Boss 移動邏輯
Sep 4, 2018 · 4 min read
最近開始著手新專案,想想還是得有自己的一個 IP 才行。原本以為自己經歷了一年磨練,實力能有所進展,沒想到仍是跌跌撞撞的哈哈。於是仍然維持自己開發筆記的習慣,來記錄一篇了!
目標

還記得不少動作遊戲中玩家打 Boss 戰時,是採用鎖定視角圍繞 Boss 對峙的狀態,但這做法在 VR 中可行不通。於是決定反過來改用 Boss 圍繞玩家的方式來規劃戰鬥,不過這下可麻煩了,因為要寫環繞移動的邏輯 Orz。
想得再多不如先刻一個雛型出來試試,最初功能如上圖 (俯視圖) 所示。對於玩家所在的位置,Boss 有遠中近三個圍繞距離,並且可主動切換所採用的距離。開發邏輯採用 Unity 友善的 Components,就先不玩 ECS 自虐了。
程式部分
回到程式這裡,本次主要分享移動的組件設計,中間會用到其他 Class 但礙於文章長度暫時先不詳細提,只簡述功能快速帶過。
Source Code
關於 Class

- 要用到 UnityEngine 和 DG.Tween 兩個命名空間
- 需要一個我自己寫的 YAxisSurrounder ,基本上就是持續以 Y 軸為軸心繞著一個原點轉的功能組件
- 是一個 Singleton Pattern 的 Class ,但仍需一個繼承 Monobehaviour 的實體,Singleton<T> 也是我之前寫的一個 Component ,主要實作 Singleton 相關功能並讓他適用於 Unity 開發環境。
參照

- 對於自身 Transform、YAxisSurrounder 和 Mesh Tansform 規劃參照快取以提升效能。
- 實作取得 Transform 的 Method,因為許多技能會需要抓取當前 Boss 的軸心位置。
屬性

- 預設是三種距離,就用 enum 切換,對照三種 speed 和 distance。
- 移動分為 Rush 和 Jump,也同樣規劃了兩種方式的必要屬性。
事件

- 主要在 Rush 和 Jump 結束時發起,後續可用於回饋 Boss 核心 AI,激發判斷下一個行動。
Monobehaviours

- 在 Awake 時取得所有參照快取。
- 在 Start 時設定參照及 訂閱事件,預設先讓 Rush 和 Jump 完成時繼續環繞玩家與玩家對峙。最後用 delegate 對這個 Class 指定四個按鍵作單元測試。
對峙方法

- 再進入環繞玩家的對峙狀態前,需要對當前的距離及角度作運算,以維持連續且平滑的移動軌跡。
- 同時實作進入和離開對峙狀態的方法供 Boss 核心 AI 方便呼叫。
衝刺方法


- 實作一個通用的 Rush 函數,並透過參數來實現衝刺到三種不同距離的方法。
- 之後 Boss 核心 AI 可能不會明確決定衝刺至哪種距離,就只是想改變距離而已,所以再多一個 RandomRush 的方法。
跳躍方法


- 和 Rush 的布局雷同就不贅述,我自己寫了一個 Ease 供 Jump 的 tween 使用,因為在 Dotween 提供的 Ease 中我找不到我要的 XD。
結語
之後也許還會再加一些新的移動方式,畢竟當前的邏輯確實沒有太大變化性,不過那些等技能設計完了再寫也不遲哈哈。我自認為架構還有很大進步空間,還望各位路過的大大不吝指教!
