#はじめに
UnityのTagを使うと処理の管理がわかりやすくなると思ったので記事を書くことにしました。
Unityの衝突処理はOnColliderを使う方法とOnTriggerを使う2通りの方法がありますが、
この記事ではTriggerを使った方法で解説します。
#OnTriggerについて
Unity スクリプトリファレンス
(https://docs.unity3d.com/jp/540/ScriptReference/Collider2D.OnTriggerEnter2D.html)
OnTriggerについてはここが詳しく説明してくださっています。
(http://seesaawiki.jp/app/d/%BE%D7%C6%CD%C8%BD%C4%EA%28Trigger%29)
BoxColliderコンポーネントのIs Triggerをオンにしたオブジェクトは、他のオブジェクトに衝突しても影響を受けないので(Triggerオブジェクト専用のイベントが起こる)、特定のものに衝突したときのみ働く処理を書くときに有効です。
#Tagを使って衝突後の処理を管理する
今回は"Wall"タグのついたオブジェクトにあたったときのみ消失し、他のオブジェクトは貫通する弾を作りたいと思います。
弾のオブジェクトに下のようにコンポーネントを設定します。
Is Triggerのチェックを入れるようにしてください。
弾の速度によってはCollision DetectionをDiscreteにしてもOKです。
弾には以下のようなスクリプトをアタッチします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
void OnTriggerEnter2D(Collider2D col)
{
if (col.gameObject.tag == "Wall")
{
Destroy(gameObject);
}
}
OnTriggerEnter2Dメソッドは、他のオブジェクトに接触した時に呼び出されます。
引数で渡されるcolには、スクリプトをアタッチしたオブジェクトに衝突したオブジェクトが入ります。
次に貫通させたくないものの設定です
"Wall"タグとBoxCollider2Dを付けます。Is TriggerのチェックはどちらでもOKです。
以上のように設定すれば、Wallタグが付いたオブジェクト以外は貫通する弾が出来ると思います。
同じ処理を行いたいものがたくさんあり、いちいちタグ付けするのが面倒なときなどはこのサイトのようなスクリプトを書けば、親オブジェクトのタグのみを変え、他は子オブジェクトにするようなことも出来ると思います。
#参考
http://freiheitp.hatenablog.com/entry/2014/10/28/014511
http://0310unity.hateblo.jp/entry/collision_detection_1