見出し画像

RTAおなじみの「壁抜けバグ」はなぜ起きる?ゲーム開発者がわかりやすく解説!

「RTA in Japan」、今日も盛り上がっていますね!私もずっと見ています。

RTAの技術の中でも、特によく使われるのが「壁抜けバグ」です。
本来は進めないはずの場所にスルリと抜け、大幅な時間短縮が狙えます。
昔から定番のバグですが、「どうして壁を抜けるの?」と疑問に思う方も多いのではないでしょうか。

今回は、ゲームプログラマの視点から、この現象の仕組みをわかりやすく解説します!



衝突判定の仕組みを知ろう

ゲームで壁や地面にキャラクターがぶつかったり、止まったりするのは「衝突判定」と呼ばれる仕組みのおかげです。この判定には大きく分けて「プリミティブコリジョン」と「メッシュコリジョン」という2つの方式があります。

プリミティブコリジョン」は、球や箱などシンプルな形状を使った判定方法で、主にキャラクターや小さいオブジェクトに使われます。「キャラクターが球の内部にいるか?」を数学的に正確に計算することが可能です。つまり、中身が詰まっています
一方、「メッシュコリジョン」は、地形のように複雑な形状をしています。こちらは壁や床の「表面」だけをデータとして扱います。内部はスカスカで、中身が詰まっているわけではありません

なぜこのような使い分けがあるのでしょうか?
理由は、処理の効率化です。

球や箱のような「プリミティブコリジョン」なら、内部判定は数学的にとても簡単で、処理が軽いです。
一方、地形のような複雑な「メッシュコリジョン」の内部にいるかどうかを正確に計算しようとすると、計算処理が非常に重くなります。
そのため、メッシュコリジョンは「表面のみに衝突判定を行う」ことで、効率的にゲームを動かしているのです。


物理エンジンと「ソルバー」の役割

さて、ゲームの中でキャラクターやオブジェクトが動く際、その動きや衝突を管理しているのが「物理エンジン」です。
このエンジンには「ソルバー」と呼ばれる仕組みがあります。ソルバーは、「オブジェクトの位置や速度を計算し、衝突していれば修正を行う」という処理を、1フレームに何度も行い、近似計算をしていきます。ソルバーの計算は重いため、1フレームに実行できる計算回数には限りがあります。


壁抜けバグはどうして起きるの?

さて、勘の鋭い方は、ここまでの話で、壁抜けバグがなぜ起きるのか、想像できたかもしれません。

ソルバーの計算はあくまで近似的な処理であり、精度を上げるほど処理が重くなります。通常プレイでは問題がない程度に精度を上げていますが、処理負荷を考えて、上げすぎないよう調整しています。

したがって、1フレームの間に高速で移動した場合、ソルバーの計算精度が追いつかず、壁やオブジェクトの「向こう側」にキャラクターが到達してしまうことがあります。これが「壁抜けバグ」の一因です。

そして、地形などの「メッシュコリジョン」は表面だけで構成されているため、キャラなどの「プリミティブコリジョン」と比較すると当たり判定の精度が低く、抜けやすいのです。


壁抜け対策はどうしているの?

開発中に見つかる壁抜けバグは、多くの場合、修正されます。
たとえば、

  • 処理負荷が許すなら、ソルバーの計算回数を増やして精度を上げる

  • メッシュコリジョンの形状を修正する

  • メッシュコリジョンの内部にプリミティブコリジョンを詰める

などの対処方法があります。

ただし、広大なマップを持つゲームにおいて、再現性が極めて低いバグのすべてに対応するのは非常にコストがかかります。
そのため、プレイヤーが普通にプレイしている範囲で起きる範囲のバグを優先して対処が行われ、再現性の低い壁抜けは見つかっても許容されることが一般的です。


まとめ

壁抜けバグが起きる理由は、以下の2つでした。

  • ゲームの物理エンジンが「処理の効率性」を重視しているから

  • 大規模なゲームおいて、通常プレイで起きない壁抜けはある程度許容されているから

地形や壁の判定をすべて完璧にするのは現実的ではなく、近似計算が行われています。その結果、ソルバーの限界を突くことで、壁をすり抜けることが可能になるのです。


もし気に入っていただけたら、ぜひフォローしていただけると嬉しいです!
Xでも情報発信をしていきますので、よかったら覗いてみてください!


いいなと思ったら応援しよう!

この記事が参加している募集