C#
Unity
衝突判定
当たり判定

衝突判定のあれこれ

More than 1 year has passed since last update.

1回理解してもしばらく経つとやらかしてるのでざっくり自分用まとめます。


Collision系とTrigger系


  • Collision系関数

関数
呼び出されるタイミング

OnCollisionEnter
他のcollider/rigidbodyに触れたとき

OnCollisionExit
他のcollider/rigidbodyと触れ合うのをやめたとき

OnCollisionStay
他のrigidbody/colliderに触れている間


  • Trigger系

関数
呼び出されるタイミング

OnTriggerEnter
Collider が他のトリガーイベントに侵入したとき

OnTriggerExit
Collider が other のトリガーに触れるのをやめたとき

OnTriggerStay
OnTriggerStay はトリガーが 他の Collider に触れ続けている間

スクリプトリファレンスより引用


違いはRididbodyの有無

Trigger系はColliderのIsTriggerのチェックボックスをオンにするだけでOK。

Collider系は衝突するオブジェクト”両方”がColliderとRigidbodyを持っている必要がある

動くもの同士の衝突判定=> Collision系

どちらかが動かない衝突判定=> Trigger系

※もっと詳しい解説 Unityつかうよ 

※もっと詳しい具体例とか Unityにおける衝突判定まとめ


衝突対象の判定


①タグ

基本こっち使う(のわりに忘れがち)

Add Tagでタグを追加して使う。


タグを使った例

    void OnCollisionStay(Collision other)

{
if (other.gameObject.tag == "sample")
{
Destroy(other.gameObject);
}
}


②レイヤー

特定のオブジェクト同士に判定をさせたくないときに便利。

Edit → Project Settings → Physics 2Dでできる。


レイヤーを使った例

    void OnTriggerEnter (Collider other)

{
string layerName = LayerMask.LayerToName(other.gameObject.layer);

if( layerName == "sample")
{
Destroy(other.gameObject);
}
}


スクリプトリファレンス

他またあったら追記します。