書籍資訊

  • 書名:《Unityで作るリズムゲーム》
  • 作者:長崎大学マルチメディア研究会

聲明

這個系列是我依照原書內容做的學習整理,用來記錄實作理解,不是正式翻譯稿。

這一篇在講什麼

這一篇先不急著寫功能,而是先把整個節奏遊戲最底層的幾個前提定清楚:

  • 畫面大致長什麼樣
  • 軌道與座標要怎麼理解
  • 判定線要放在哪裡
  • Single Note 與 Long Note 的外觀怎麼拆

如果這些基礎沒先講清楚,後面不管是 Note 生成、時間換算還是判定邏輯,都會一直卡在「畫面到底對不對」這種問題上。

先看範例成品的樣子

這本書做的是比較傳統的下落式節奏遊戲,Note 會沿著固定軌道往下掉,玩家在判定線附近輸入按鍵。

這個範例最基本的設定可以先整理成四件事:

  • Notes 會沿著 n 條軌道自上而下掉落,書中的案例是 5 軌。
  • 每個按鍵對應一條軌道。
  • Note 分成單押與長押兩種。
  • 譜面格式使用 BMS

先建立 2D 專案

第一步很單純,就是先建立一個 2D 專案,把後面會用到的遊戲視角先固定在 2D 工作流裡。

這一步看起來沒什麼內容,但它的意義其實是先把整個專案的空間關係鎖定下來,避免後面寫到一半又回頭改基礎設定。

先把軌道與座標概念定下來

因為 Note 是往下掉的,所以這個例子裡:

  • x 軸用來表示它屬於哪一條軌道
  • y 軸用來表示它距離判定線還有多遠

也就是說,Note 會沿著 y 軸從正值逐步往 0 甚至負值移動。

這個約定很重要,因為後面幾乎所有位置更新都會依賴這個前提。只要座標語意先定清楚,後面很多問題都能直接寫成簡單的公式。

判定線的基本設定

判定線本身不複雜,但最好先把它放在一個好推算的位置。這裡最方便的做法是:

  • 先把判定線放在 x = 0
  • 再把判定線放在 y = 0

這樣做的好處是,後面所有 Note 的位置都可以直接用「它和判定線還差多少」來理解,不用每次都再加一層偏移量。

至於判定線的寬度,也就是 Scale.x,則可以留給後面依照軌道數量去調整。

Single Note 與 Long Note 的外觀

Single Note

Single Note 的寬度要和軌道寬度對齊,所以最直觀的做法就是:

判定線寬度 / 軌道數量

Long Note

Long Note 的外觀不適合只用單一 Sprite 硬拉長,通常會拆成三段:

  • Begin
  • Mid
  • End

這三段分別代表:

  • Begin:長押開始接觸判定線的那一拍
  • End:長押即將離開判定線的那一拍
  • Mid:連接起點與終點之間的本體

Mid 的處理方式也很直觀:

  • Scale.y = End.y - Begin.y
  • Position.y = (End.y + Begin.y) / 2

也就是說,Mid 不需要自己知道整條 Long Note 的時間,只要根據起點和終點的位置自動補中間那段長度就夠了。

我自己的整理

這一篇表面上像是在做畫面準備,但本質上是在定義整個節奏遊戲的座標語言。

後面無論是 Note 生成、BPM 換算、Long Note 拉伸,最後都會落到同一個問題:

「某個物件現在應該出現在判定線的哪個相對位置?」

所以這一篇最有價值的,不是那幾張圖本身,而是它把這套空間關係先固定下來了。

先記住的重點

  • 下落式節奏遊戲裡,x 通常對應軌道,y 通常對應和判定線的相對距離。
  • 判定線先固定在原點,後面的所有位置推算會簡單很多。
  • Single Note 的寬度通常直接跟軌道寬度一致。
  • Long Note 很適合拆成 Begin / Mid / End 三段來做。