当たり判定をボーンに追従させる ― 体格の違うキャラで技データを共有する
攻撃判定の位置を固定座標ではなく、手や足のボーンからの相対位置で決める方式にしました。モデルを差し替えても判定がずれない理由と、その設計を説明します。
- Unity
- アクション
- 当たり判定
- 設計
アクションゲームの攻撃判定は、キャラクターのどこに、どれくらいの大きさで、 いつ出すかを決める必要があります。このプロジェクトでは、その「どこに」を キャラクターのボーン(骨格)からの相対位置で決める方式にしました。 プロジェクト内では方式Cと呼んでいます。
固定座標で決める方式の問題
一番単純なのは、キャラクターの足元を原点として、 「右に 80 センチ、高さ 1 メートルの位置に判定を出す」のように 固定の座標で決める方式です。2D の格闘ゲームなどではよく使われます。
しかし 3D で、しかもモデルを差し替えられる Mod 対応のゲームでは、 この方式はすぐに破綻します。
たとえば、身長 170 センチのキャラクター用に調整したパンチの判定を、 身長 2 メートルの大柄なキャラクターに流用したとします。 固定座標のままだと、判定は大柄なキャラクターの胸のあたりに出てしまい、 拳の位置とまったく合いません。逆に小柄なキャラクターでは、 拳より遠くに判定が出てしまいます。
結果として、体格の違うキャラクターごとに技のデータを作り直す必要が出てきます。 Mod 作者にとっては大きな負担ですし、本編の開発でも手間が膨らみます。
ボーンに追従させる
そこで、判定の位置をボーンからのずれで指定することにしました。
パンチなら右手のボーン、キックなら右足のボーンを基準にして、 そこから少しずらした位置に判定の箱を置きます。ボーンの実際の位置は、 アニメーションが再生されている最中に毎フレーム計算されます。
こうすると、大柄なキャラクターの拳は大柄な位置に、 小柄なキャラクターの拳は小柄な位置にあるので、 判定は自然に拳の位置についていきます。同じ技のデータを、 体格の違うキャラクター間でそのまま共有できるようになります。
人型ボーンの共通化を前提にする
この方式が成り立つのは、Unity に人型のボーン構造を共通化する仕組みがあるからです。 モデルごとにボーンの名前や階層は違いますが、Unity がそれを 「右手」「左足」といった共通の名前に対応付けてくれます。
技のデータには、この共通の名前を文字列で書きます。
右手なら RightHand、右足なら RightFoot という具合です。
何も書かなければ、キャラクターの原点、つまり足元が基準になります。
全身を覆うような判定や、足元の判定にはこちらを使います。
ボーン追従でも気をつけること
ボーンに追従させれば万事解決、というわけではありません。
一つは、アニメーションの動きがそのまま判定の動きになることです。 モーションの出来によっては、拳が一瞬だけ大きく振れたり、 想定と違う方向に伸びたりします。固定座標なら起きなかった判定のブレが、 ボーン追従では起きうるということです。判定の大きさにはある程度の余裕を持たせ、 モーション側も判定を意識して選ぶ必要があります。
もう一つは、攻撃判定と食らい判定の両方にこの考え方を当てはめることです。 攻撃する側の判定だけボーンに追従させても、攻撃を受ける側の判定が 固定のままだと、しゃがみや仰け反りの姿勢で不自然な当たり方をします。 このプロジェクトでは、食らい判定も同じ方式で扱うようにしています。
まとめ
判定の位置をボーン基準にしたのは、Mod でモデルを差し替えられることを 前提にしたゲームだからこその判断です。 技のデータとモデルを独立させられれば、Mod 作者は 「新しいキャラクターを作る」と「新しい技を作る」を別々に行えます。 組み合わせの自由度が上がることが、この設計の一番の価値だと考えています。