Unity 2D アイテム 取得 当たり判定

2D系の敵がバラまいたアイテムの当たり判定の処理です。

探しても見つからなかったので描きます。

 

この記事の読者レベルは中ぐらいです。リジッドボディってなに?ってレベルの人にはお勧めしません。

 

本題に入りますが、2Dアクションでよくある「敵を倒したらコインとかアイテムとかばら撒いて死ぬ」みたいな事があると思います。

先ほど作っていたのですが困った事が発生しました。以下をご覧ください。

f:id:donnpema6:20170115051507g:plain

 

ばら撒かれたコインの物理の影響を受けてプレイヤーが吹っ飛ぶバグです。

 

原因としてはOnCollisionEnter2D()で処理しているという事です。

ならばOnTriggerEnter2D()を使えばいいという話ですが、

地面にコインが撒かれるのでCollider2D系のIsTrigerをONにすると地面もすり抜けてしまいます。だからOnTriggerEnter2Dを使用していたのですが当たった瞬間の処理ではないので物理の影響を受けてしまいました。

マリオとかの空中に浮いてるコインならばOnTriggerEnter2Dで事は済むのですが。

 

で自分なりに考えた解決策です。あってるか分かりませんが問題は解決しました。

当たり判定用のオブジェクトを用意するです。

f:id:donnpema6:20170115052757p:plain

物理的な挙動はMoneyObjという親のオブジェクトに任せます。親にはなにもスクリプトを付けていません。

その代わりプレイヤーとの接触判定は子の当たり判定用のMoneyCollというオブジェクトに任せます。これはRigidBodyを持ちませんあくまで当たり判定のみを行うので。

ポイントなのが、親のオブジェクトより大き目の当たり判定にしておく。以下参考画像f:id:donnpema6:20170115053241p:plain

外側の円のCollider2Dが子の当たり判定でIsTrigerをONにできます。

これでプレイヤーとの当たり判定ができかつ物理の影響をなくす事ができます。

地面との物理的な挙動は内側の親のCollider2Dが勝手にやってくれます。

一応ソース貼っておきます。 

gist3a4ead7c231f9da27e9b6bf00bcf04ff

 

他に良い方法があったら教えてください。

以上です。