Beat Saber の基礎について

# 0. はじめに
今年（ 2022 年 ）の正月くらいからハマり出したので，Beat Saber の基礎について書いてみる．既に発売から 4 年経ってはいるが．

# 1. 概要
チェコにある [Beat Games](https://beatsaber.com/) 社が開発した VR 対応のリズムゲーム[^1]だ．次の gif を見ていただくのが早い．
![Beat Saber GIF](https://media.giphy.com/media/UPv0qEJqNfoh9kyFOe/giphy.gif)
両手のコントローラーが各々サーベルとなり，リズムに合わせて "箱" を斬る．この箱は Notes（ ノーツ ）と呼ばれる．公式のリリース動画は [こちら](https://www.youtube.com/watch?v=ja67hoanefY)．ちなみに Unity で作られている．

[^1]: [Beat Saber](https://ja.wikipedia.org/wiki/Beat_Saber)

# 2. 遊び方
基本的なことは [こちら](https://www.youtube.com/watch?v=EJIMULOXbYI) のチュートリアルを見れば分かる．

- ノーツには矢印(*1)が書かれており，その方向に沿ってリズム良く斬っていく．
  矢印ではなく丸印(*2)が書かれたノーツの場合は，どこから斬ってもよい．
  違う方向に斬ったりスカったるすると，ミスとしてカウントされる．
- ノーツには色が２つあり，サーベルの色と同じノーツを斬る
  違う色のノーツを斬ると，ミスとしてカウントされる．
- ボム(*3)は斬らない．斬るとミスとしてカウントされる．
- 壁(*4)は避ける．当たるとミスとしてカウントされる．
- 体力ゲージがあり，ミスを連発するとゲームオーバーになる．
  ノーツを正しく斬ると少しずつ回復する．

正直，ここまで書いたことのみ把握していれば全然楽しく遊べる．
以降は，よりゲームを理解し楽しむための情報だ．

*1: 矢印ノーツ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708376/04b79c09-3674-835a-3b84-f742dd33c020.png)

*2: 丸印ノーツ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708376/c3bed57b-85e7-7b53-580b-44ae2a9139f6.png)

*3: ボム（ 黒いトゲトゲしたやつ ）
![Bomb](https://media.giphy.com/media/GGXdcXmKONyC0t1p2k/giphy.gif)

*4: 壁（ 半透明の大きな直方体 ）
![Wall](https://media.giphy.com/media/KDzBwc0K9OgFGfbvuf/giphy-downsized-large.gif)

## 2.1. 特殊なノーツ

上記では省いたが，Version 1.20 から２つの新しいノーツが誕生した．
これらのチュートリアルについての公式動画は [こちら](https://www.youtube.com/watch?v=S5EnYBttaaA&list=PPSV)．

- アークノーツ
  サーベルとノーツ，ノーツ間を繋ぐ発光した帯のようなもの（ 下図の矢印を参照 ）．ガイドにもなっている．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708376/b9a3cee4-cefd-26d3-3ef1-4594d50c90d7.png)

- チェーンノーツ
  矢印ノーツに丸印ノーツが数珠つなぎのようにくっついたもの．丸印ノーツはほんの少しずつ後ろの位置にズレているので，一回で斬るというよりは，気持ちゆっくり目にサーベルを流すとう感じに斬る．元々，ノーツは１つの音符毎に配置する慣習があったため持続性のある音符を表現する良い手段がなかった[^2]が，チェーンノーツによって表現可能となった．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708376/7ed10f8d-724b-fafb-7537-5a5654398ccf.png)

これの攻略は，次章で述べる得点についても大きく関係してくる．

[^2]: MOD ではスライダーと呼ばれる配置が作られている．ひょっとすると逆輸入だったり？

# 3. 得点について

１つのノーツあたり最大 115 点得られる．アークノーツとチェーンノーツの場合は少々変わってくる．
また，後述するコンボ数によって倍率が最大 8 倍にまでなる．

大きく分けて次の３つの要素だ
- ノーツを斬る前と切った後の振り角（ 最大 100 点 ）
- ノーツを斬った時のノーツ重心からの距離（ 最大 15 点 ）
- コンボと得点倍率の関係（ 最大 8 倍 ）

また，ちょっとマニアックな指標に「タイミング依存性」[^3]というものがある．
各々節で分けて説明する．

[^3]: [Time Dependence](https://docs.google.com/document/d/1Q8-naaDUfAB-bDhcBDgV7McSgI0iaoMTJKDDk-9PHR8/edit)

## 3.1. 振り角
サーベルでノーツを斬る際に，100° 以上で振りかぶり 60° 以上で振り切るようにすると，最大の 100 点が得られる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708376/106e09ca-6bf7-e8a5-a282-f5f96bcef8fe.png)
ノーツ配置の密度が高くなったりノーツ間の距離が大きくなってくると，斬るだけで精一杯になってしまい触れ角にまで意識がいかないことがしばしばある．

## 3.2. 重心からの距離
ノーツの切断面が重心を捉えていると最大 15 点が得られる．もう少し厳密に書くと，サーベルがノーツに当たった時の斬り込み面とノーツ重心の間における 3D 空間上の距離 $d$ が $0$ のとき最大 15 点となる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708376/1f4a2b1a-b877-37d4-c94c-aa1ac027fcf1.png)


## 3.3. 倍率
コンボを増やしていくことで，１つのノーツに対して最大 8 倍の点数を得ることができる．逆にコンボを切らしてしまうと，倍率が少しずつ低下する．できるだけコンボを継続させることが重要だ．

コンボ数と倍率の関係は [こちらの記事](https://website-note.net/vr/beat-saber-rule-and-how-to-play/#:~:text=%E3%81%A8%E5%90%8C%E3%81%98%E3%81%A7%E3%81%99%E3%80%82-,%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AE%E5%80%8D%E7%8E%87%EF%BC%88Max8%E5%80%8D%EF%BC%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6,%EF%BC%91%EF%BC%94%E3%82%B3%E3%83%B3%E3%83%9C%E3%81%8B%E3%82%89%E3%81%A8%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82) で調べられている．自分の動画でも確認済だ．
|コンボ数|倍率|次の倍率までのコンボ数|
|-:|-:|-:|
|1 ~|1|2|
|3 ~|2|3|
|6 ~|4|8|
|14 ~|8|-|

一回ミスると倍率が一段階下がり，上げるためには再度コンボを繋いでいく必要がある．

## 3.4. タイミング依存性
この節では，ノーツの重心を完全に捉えていることを前提にする．もちろんそうでなくても説明はできるが話がややこしくなる．重心を捉えてないときの注釈は最後に書く．

タイミング依存性は，ノーツを斬った時のサーベルの振りがどれだけタイミングに依存していたか，という（ ほぼ練習目的のための ）指標である．コミュニティーの中では Timing dependence と呼ばれている．また，[TD 値として確認することができる MOD](https://github.com/PulseLane/Time-Dependence-Counter) が存在する．

ここで「リズムゲーなんだからタイミングに依存するのは当たり前なのでは」と思うかもしれない．しかし，実は割と緩めなタイミングであっても 15 点を得ることができる場合がある．それはノーツを斬る際のサーベルの向きが大きく関係する．下図を見ると何となく分かるかもしれない．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708376/af4ed901-6366-af69-132f-0027a05d2644.png)
下に書いてある数字は TD 値である．0 はタイミングに依存しない，1 はタイミングに完全に依存することを意味している．ちなみに，MOD では上記 TD 値に 15 点を乗じた点が返される．


以下，各 TD の場合について説明する．

### TD = 0
Timing independent と呼ばれる．例えば，ノーツの進んでくる線上に移動して，そのまま真っ直ぐサーベルを振り下ろすことを考える．このとき，射程圏内であれば，どのタイミングでサーベルを振り下ろしても確実に重心を貫くことができる．よって，タイミング依存性はない．

TD が非零の場合は Timing dependent と呼ばれる．

### TD = 0.5
ノーツの重心を斜めから斬ることを考える．このとき，僅かに早い/遅いタイミングでサーベルを振り下ろしても重心を掠る可能性は幾らかある．例えば，真っ直ぐ振り下ろす他にも，斜めに振り下ろしても重心を貫くパターンは存在する．また，ノーツの重心とサーベルの衝突範囲は単純に点と線の関係ではなく，一定の半径的な領域が存在するため，ある程度のタイミングの許容幅も存在する．この許容幅は timing window と呼ばれる．

### TD = 1
ノーツの重心を真横から斬ることを考える．Timing window はあるものの，重心を捉えることのできる斬り方は１つしかなく，本当に丁度のタイミングで真っ直ぐ振り下ろすしかない．

以上の項を踏まえると，安定したサーベル捌きをするには TD 値を小さくするような動きをめざせば良い．ただ，ノーツの配置が密だったりスピード（ NJS: Note Jump Speed と呼ばれる ）が速くなってくると TD = 0 になるような移動は困難だ．そのような場合は，移動を抑えつつできる限り腕と手首を駆使して TD 値を小さくするような斬り方を意識する．

また，重心を捉えそこなった場合は，TD = 0 であっても 15 点にはならないことは分かっていただけるかと思う．ただ，TD が小さくなる動きをすれば，重心を捉えることのできる機会が多くなるということに変わりはない．

もちろん，この TD 値が全てというわけではない．飽くまで参考程度に，というまでだ．

## 3.5. 特殊なノーツ
アークノーツとチェーンノーツについては，少々得点とその与え方が異なってくる．下表にまとめた．アーク開始とチェーン矢印については全く同じ．チェーン丸印については触れるだけで 20 点のようだ．しかもチェーン矢印から始まらず途中から斬っても良い．

|影響する要素|振りかぶり|重心位置|振り下ろし|最大得点|合計|
|:-:|:-:|:-:|:-:|:-:|:-:|
|アーク開始|$\checkmark$|$\checkmark$||85|115|
|アーク途中||$\checkmark$||15|115|
|アーク終了||$\checkmark$|$\checkmark$|45|115|
|チェーン矢印|$\checkmark$|$\checkmark$||85|85|
|チェーン丸印||||0|20|

簡単に図にしてみた．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708376/e2aba34f-89ab-7e48-1b91-a8f9985c6400.png)