今回はアクションゲーム制作における“コリジョン”についてお話します。
コリジョンとは?
一般論として
”キャラクターやオブジェクト同士の接触を判定・制御するための仕組み(当たり判定)”を指します。
その判定に使用する形状をコリジョン形状と呼びます。
実際のゲーム中には見えない形状として扱われる事と、ゲームの計算負荷を最小化とプレイヤーの移動を安定化させる
必要がある事から、ディテールを省略したシンプルな形状である事が最適だと捉えられがちですが、
ゲームとしての扱いやすさによってコリジョン形状の最適解は異なります。
一般的なコリジョン形状の分類
⬜︎ PolySoup (任意形状)
→ MayaなどのDCCツールで作成したメッシュをそのまま出力するタイプです。
⬜︎ ConvexHull (凸形状)
→ 点群データから自動生成されるので計算負荷は低コストです。
凹形状の部分は塞がってしまうので複数のConvexHullで構成するなどの工夫が必要になります。
⬜︎ Cupsule / Box / Sphere
→ 数値データで生成できるプリミティブな形状です。各軸の半径のみで生成される為、低コストです。
カプセル形状は一見ポリゴン数が多く高負荷に見えますが、実際は2頂点の距離と半径のみで計算されます
① コリジョンの設計基準
そのゲーム内でキャラクターがどういうアクションが許容されているかによって
必要なコリジョンやゲームシステムとして管理すべきルールが異なるので、基準の考え方自体も多種多様です。
プレイヤーアクションがどの条件で発動可能かとセットで設計する必要があります。
プレイヤーアクションの例
⬜︎ 歩く/走る/泳ぐ
→ 移動範囲を制限するために壁/床/水中(接触面&水中範囲)の判定ルールが必要です。
⬜︎ しゃがむ/ジャンプ/ぶら下がる
→ 登れる場所/登れない場所/掴まれる位置などを決めるルールが必要です。
⬜︎ 攻撃する(近接/遠隔)
→ 攻撃判定と対象の具体的なリアクションを決めるルールが必要です。
例:動かせるのか/弾かれるのか/どこまで届くのか/貫通するのか
② ステージ規約に基づくコリジョン形状
アクションゲームのステージ設計では、
プレイヤーの移動やアクションに合わせて、コリジョンの設計寸法や配置ルールを定義する事が重要です。
(仮にステージ規約と呼称します。)
ステージ規約に基づいた上でレベルデザインを行うことにより、壁や隙間にハマって動けなくなる、段差に引っかかる
といった問題を防止しやすくなり、ゲームプレイの一貫性も担保されます。
ステージ規約の例
⬜︎ 通路幅, ドア幅
→ プレイヤーが安定して通過できる事に加え、装備品や武器などが壁に埋まることがないように、
最低保証としての縦横幅が規約化されている事が重要です。
また搭乗できる車両や、体格の違うプレイヤーキャラがいる場合は別規約での管理となります。
⬜︎ 空気壁
→ いわゆる、ゲーム的に入って欲しくない場所や、ゲームエリア外周を塞ぐための見えない壁です。
想定外のバグ技を使ったとしても絶対に越えられないように、十分に高い壁を設定すると良いでしょう。
その他、背景モデルの内側や作り込んでいない場所を見せないようにする為、
プレイヤーだけでなくゲームカメラの操作範囲の制限を空気壁でコントロールする場合もあります。
⬜︎ 階段
→ 階段の縦横比をゲーム全体で統一する事でプレイヤー/NPCの昇降モーションの整合性が担保されます。
比率や段差の寸法が場所によってバラバラだと、足浮き/埋まり/ガクつきが起こる可能性があります。
また、階段のプレイヤーコリジョンは基本的にスロープ形状として作成します。
階段形状そのままだと、頭の位置やカメラがガタガタしてしてしまいます。
スロープ形状でも、IKで足の位置は段に吸着するので自然な見た目になるという実装が一般的です。
③ コリジョン属性と判定対象
コリジョンモデルは付随する属性/識別情報(頂点カラー/レイヤー情報/ID情報など)を使って
フェースごとのマテリアル(材質)の種別や、プレイヤー挙動の制御を行う事ができます。
また、判定対象(プレイヤー移動/攻撃判定/カメラ移動など)によって反応を変える必要がある場合は
それぞれに専用のコリジョンモデルを用意して運用する事も一般的です。
コリジョン属性による判定の例
⬜︎ マテリアル(材質)の種別
→ プレイヤーの足音が場所によって、土だったり、コンクリートだったりと変化させることが出来ます。
同時にエフェクトも小石が飛び散ったり、水が跳ねたり、草が舞ったりと多彩な実装が可能です。
このように、細かなサウンドの差異などによってリアリティに大きく貢献しますが、
ゲームによっては記号性を優先し、意図的に同じサウンドでリアクションさせるケースもあります。
⬜︎ プレイヤー挙動の制御
→ コリジョン属性とゲーム側の処理を組み合わせる事で、特定の場所での挙動を制限する事ができます。
例:必ず滑り落ちる斜面/掴まれない崖
④ プレイヤーモーションとコリジョンの関係
背景ステージのコリジョンがプレイヤーモーションに影響するのは大部分は歩行時です。
足裏の接触面が僅かに埋まったり浮いていたとしても、カメラ位置や移動速度によっては目立たないのですが、
モーションによって手が直接触れる場合、数センチの埋まりでもゲームプレイの印象に影響しやすくなります。
モーションとコリジョンの関係例
⬜︎ 歩行↔︎しゃがみ
→ 壁際を歩行している際、しゃがみモーション時だけ顔位置が少し前に出て壁に埋まるケースがあります。
この場合、コリジョンの位置を壁から少し広めにバッファを取ることで埋まりは回避できますが、
不自然に壁と距離が離れたり、本来通れていた場所が通れなくなるような懸念もあります。
また、プレイヤーの装備によって外見が変化(パーツが追加される)するケースも考慮し、
さらにコリジョンを広めにするのか、一定の埋まりを許容するのかという判断が必要になります。
⬜︎ 梯子の昇降
→ プレイヤーの昇降モーションとステップの位置/幅/間隔が一致している必要があります。
プレイヤー側の処理によっては、昇降モーションの始点がズレると掴む位置がズレる懸念もあります。
余談ですが、ゲーム記号的にハシゴが昇降できるものである場合、
登れないハシゴはユーザー視点からすると紛らわしいので配置しない方が無難です。
アセットの見た目は、ユーザーの期待とゲーム上の機能が一致している状態が望ましいです。
⬜︎ 崖掴まり
→ 主に自然地形の崖の場合、掴まる位置によって指が埋まったり浮いたりするリスクが高くなります。
ゲームカメラがプレイヤーの手元にフォーカスしやすく、コリジョン形状のシビアな調整が必要です。
私の経験上、実際にテストプレイして微調整を重ねた上での経験則がある程度必要になると考えます。
まとめ
コリジョンという主語が大きなトピックを扱った記事なので、私の認識と齟齬がある部分があるかもしれません。
あまり断定的な言い回しにならないように記載しました。
コリジョンモデルはフェースや頂点の1つ1つに意味が集約される傾向が強いので
概要として全体像を理解できると、実制作での判断が多少容易にはなるかと思います。
参考
【西川善司が語る“ゲームの仕組み” Vol.4】実際のゲームの「当たり判定」はカプセル剤で出来ていた!?
https://gamemakers.jp/article/2023_10_16_47881
--300x141.png)

