淺談環繞移動型 Boss 移動邏輯

Rain Wu
Rain Wu
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。

結語

之後也許還會再加一些新的移動方式,畢竟當前的邏輯確實沒有太大變化性,不過那些等技能設計完了再寫也不遲哈哈。我自認為架構還有很大進步空間,還望各位路過的大大不吝指教!

遊戲開發隨筆

在開發遊戲的過程中,我能深刻的感受到自己的創造力與想像力得到了解放。能夠做自己想做的遊戲是一件非常開心的事,偶爾會寫篇筆記上來分享。

Rain Wu

Written by

Rain Wu

Pro-Gammer !!

遊戲開發隨筆

在開發遊戲的過程中,我能深刻的感受到自己的創造力與想像力得到了解放。能夠做自己想做的遊戲是一件非常開心的事,偶爾會寫篇筆記上來分享。

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade