【Unity2D】衝突判定の実装について
こんにちは。なおキーヌです。
ブログ毎日更新は319日目になります。
前回「【Unity2D】スクロール処理とエリアの移動処理をどうするか」にてエリア移動とスクロールについて考えました。
衝突判定はUnityでは簡単に行えます。
リジッドボディというコンポーネンとを衝突判定させたいオブジェクトに取り付けます。
これは衝突する側・衝突される側どちらにも必要になります。
本来は3Dオブジェクトの物理演算的なことにつかうコンポーネントなのですが、
使いようによっては2Dのゲームにも流用できてしまいます。
リジッドボディには摩擦やら重量やら物理演算に使うような設定項目があり、
それらを0にすると重力が働かなくなったり摩擦が無くなります。
そうするとぶつかった地点で静止ないし押すことが可能になります。
実はこのコンポーネントを使えば物を押す処理を簡単に作ることができます。
あとは押される側の判定と地面の判定が取れたら扉を開くという処理を作れば、
物でスイッチを固定するという仕組みが作れてしまいますね。
逆に摩擦とかを利用してしまえば2Dのゲームでも物理演算を使ったゲームが作れてしまいます。
ただ物理演算は下手な処理をするとオブジェクトが角にハマったり、
いわゆる詰み状態になったりもするので何かしら状態をリセットする方法を設けておきましょう。
メジャーな方法で言えば動かしたオブジェクトはエリア移動を行なったら初期の位置に戻るという仕組みを作るとかでしょうか。
スクリプトでも衝突判定は実装可能
ゲーム系のエンジンを使わずにライブラリだけでゲームを作ったことがある人なら
衝突判定はスプライトの矩形同士で移動先が触れているかどうかでやっていたと思います。
Unityでもそういった実装はスクリプトを使えば実装可能です。
コンポーネントを使うよりも余計ない機能が動かない分処理は軽いので、
2Dゲーム制作に慣れている人はあえてUnityの機能を使わずにスクリプトで全部買いてしまう人もいるでしょう。
今の時代スペックも十分に高いのですが、スペック低めのスマートフォンを対象とかにする場合は意外と捨てたもんじゃない実装法です。
他にも恩恵としては重力や摩擦がある場合のリジッドボディの場合、最悪めり込んでぶっ飛んだりするので
製作者の意図しない動きになってしまってバグに繋がってしまいます。
なので可能なのであれば全てスクリプトで制御してしまった方が安全ですね。
ただ、それだと別にUnityじゃなくてもいいんじゃない?ってなってしまうので
私は一旦Unityのコンポーネンとをフルに使ってどうしてもダメならスクリプトで制御と言った感じです。
しかし大体かゆいところに手が届かなくてスクリプトで制御しだすんですけどね(笑)
こういう時がっつりプログラミングしててよかったなと思います。
それでは。