今回はビートセイバーのノーツの当たり判定について書いてみようと思います。
ビートセイバーのノーツの当たり判定は、目に見えるノーツモデルの外側に大きい直方体と、内側に小さい立方体の二種類用意されています。
twitter post: 1337526866035404801
大きいほうの当たり判定は、セイバーとノーツが同じ色の場合のみに反応し、同色セイバーをこの部分に当てればノーツが切れる一方で、異なる色のセイバーがここに当たっても、ミスにはならず何も起こりません。
小さいほうの当たり判定は、セイバーとノーツが異なる色の場合でも反応し、このときはミス(バッドカット)判定となります。
何のためにこのような仕様になっているのかというと、単純にプレイフィールを良くするためです。人間、自分に都合の良い嘘は気持ち良く流す一方で、不利になる嘘に対しては大きな理不尽を感じるものです。ですので、ゲーム作りの流儀として、プレーヤーに利する当たり判定は大きく、害する当たり判定は小さく、というのが定石になっています。
上の画像の通り、この2つの当たり判定の違いはかなり大きいので、下の動画の0:05のような赤青が同じ場所に重なったノーツでも、ほぼ同時に赤と青のセイバーでこの場所を振れば、両方のノーツがミスなく切れるようになっています。
twitter post: 1333752884178030594
気になる当たり判定の大きさは、現行バージョンのビートセイバー(1.19.0)では以下のようになっています。(以下Unityの1単位を1mとして)
大きいほうの当たり判定:
縦 50cm 横 80cm 奥行き 100cm (当たり判定の中心は、ノーツの中心から25cm手前)
小さいほうの当たり判定:
縦 36cm 横 36cm 奥行き 36cm
見た目の大きさ (およそ):
縦 47cm 横 47cm 奥行き 47cm (公式のデフォルトノーツ)
縦 40cm 横 40cm 奥行き 40cm (カスタムノーツのデフォルトテンプレート)
また、ノーツを切ったとき、どのくらい中心近くを切ったかで0~15点の加点が入りますが、この最大の15点が入る大きさはどのくらいでしょう。この部分の計算は
n = 1.0 - Clamp01(distance / 0.3);
score = RoundToInt(15.0 * n);
という処理になりますが、わかりやすく直すと下記のようになります。
1. 30cm - 中心までの距離[cm]、マイナスになったときは0点
2. 1.を2で割って四捨五入(厳密には四捨五入ではなく.5の場合、偶数のほうに丸める)
つまり、中心から20cm離れていれば、(30-20)/2=5点、10cm離れていれば(30-10)/2=10点、わかりやすいですね。そして、最大15点を出すためには中心から1cm未満であればよいので、直径2cmの範囲を狙って切る、ということになります。
ちなみにセイバーのほうの当たり判定は直線です。太さはなく、セイバーの刃部分の先端と末端を結んだ長さ 1m の直線が、判定に使用されるセイバーの実体です。また、どんな見た目のカスタムノーツやカスタムセイバーを使用しても、当たり判定は変わりません。