Unityでインディゲーム道!

プログラム、Unity初心者がインディゲーム制作を目指して日々思うことなどを書き綴ります。

ゲーム製作を学んで一番感動したこと。なぜマリオは壁の中で立てるのか。[ 当たり判定 ]


 ゲーム製作やプログラミングを現在も勉強中ですが、それ以前は当然、単なるゲームプレイヤーでした。今では、それに違う視点も加わることで、ゲームというものを多面的に見れるようになり、また別の面白さを味わえるようになっています。


 その中で、特に感動したのが当たり判定についてです。プレイヤーキャラと敵キャラが当たってダメージを食らう処理とか、そもそも地面に立てたりできるのすら、すべて当たり判定のおかげです。
 考えてみれば、ゲームというのはコンピュータ上におけるプログラムによるもので、実体はありません。画面に見えているのものは単純に画像であって、それだけでは幽霊のように見えているけど、触ったりすることが出来ない状態です。

 実体があるかのように感じさせるために、当たり判定は根幹的機能を果たします。当たり判定に基づいてレスポンスがあることで、ゲームプレイにおける感触や実感というものに繋がりますし、また逆に当たり判定が適当だったり、厳密すぎるとストレスに感じることもあるわけです。

マリオの当たり判定

 子供の頃の思い出として、スーパーマリオでの体験があります。マリオはキノコを食べると巨大化できますが、そうすると1マス分の穴に潜れなくなります。しかし、走りながらタイミングよくしゃがむと、しゃがみ状態で穴に滑り込めます。
 面白いのは、その状態で立つ事ができるということです。そして、穴を出るまでニューっと押し出されます。この押し出される、というのがポイントです。共感してくれる人は多いと思うんですが、このニューというのがすごく好きで、マリオを遊ぶときは毎回やってた思います。

 現実においては、自分の身長よりも小さい穴の中で立つことはできないですよね、当然ですが。実体のある人間と壁はぶつかるからです。しかし、ゲームではそうではありません。当たり判定、とは言われますが、実は当たっていないんです。

当たり判定はなにするの?

 つまり、当たり判定とはゲーム上のオブジェクト同士が重なったら、『当たった』と判断し、重ならない状態まで押し戻すことで、実体があるかのように見せるのが本質だというのです。正直、こういう説明を目の前にして、最初は実感が湧きませんが、先ほど書いたマリオでの体験を思い返せば、至極納得がいきます。

 マリオが穴の中で立った瞬間、マリオと壁という2つのオブジェクトが重なり合い、その結果、動的オブジェクトであるマリオが壁の外まで押し出されるからです。こんな風に過去の体験の理由をその仕組みと共に理解が出来たのが、今までで一番感動した瞬間ですね。


 そもそも、キャラが地面に立つというのも、立っているのではなく、理論的には地面が常にキャラを押し返し続けている、ということになります。また、押し出す処理が必要ない場合は、重なった!という判断だけをするトリガーとして扱われます。これは敵味方のビームや空中を自由に浮遊してくる敵キャラなどがそうですね。

仕組みが分かればトラブルも!

 なんで、壁を取りぬけてしまうバグなどもこの仕組みが分かっていれば、何故起こるのか理解できます。つまり、重なっているという判断をする前に、フレームを跨いで壁を通りぬけてしまうと押し返せない、ということなのです。面白いですよね。ハイスピードなレースゲームなんかは、より速いレートで当たり判定を行うことで、すり抜けないようにするみたいですね。

 また、銃弾の玉をオブジェクトとして飛ばすとコレもまたすり抜けてしまうので、Unityでもそうですが、レイキャストを飛ばして、つまり空間上を線と線で結んで判断する、みたいな処理をするようです。

 また、当たり判定はある程度は大らかである方が、ゲームプレイ上いいようです。適当な当たり判定に憤慨する、ということは昔のゲームではよくありましたよね。

まとめ!

 というわけで、個人的に感動したことを交えつつ、当たり判定について書いてみました。Unityではコンポーネントとしてコライダーが準備されているので、ゲームオブジェクトにアタッチしてすぐ使えます。便利な世の中!

[参考文献]
ゲームの作り方 改訂版 Unityで覚える遊びのアルゴリズム on Amazon