立命館大学情報理工学部プロジェクト団体 ゲーム&CG部門 RiG++

新しいホームページに移転しました

https://rigpp.sakura.ne.jp/wp/

RiG++アドベントカレンダー2日目を担当する しもむ~ です。

一応昨日の告知が1日目ということで…

Unity使い始めたての人がよく陥る「当たり判定が取れない」現象

それに対するトラブルシューティングを書いていく
ここに書いてあること確認したら当たり判定が取れない現象の8割は解決すると自負しています

  • まずRigidbodyとColliderがGameObjectにあるか

当たり判定を取るのにColliderは必須(3DだとBoxColliderやSphereColliderなど)
また、OnCollision系やOnTrigger系の関数はRigidbodyがないと

呼び出されないので必須
少なくとも

  • RigidbodyはOnCollision~やOnTrigger~が書かれたスクリプトを持ってるGameObjectに
  • Colliderは当たり判定を取るGameObjectと衝突相手のGameObject両方に

つける必要がある

  • ColliderのIsTriggerのとスクリプトに書いてある衝突判定は合っているか

GameObjectにあるColliderのIsTriggerにチェックが入ってるときは
OnCollision系の関数は呼ばれない
IsTriggerにチェックが入っていない場合は、OnCollision系もOnTrigger系も
呼ばれる可能性がある(相手のIsTrigger次第)

  • 関数の綴りが間違ってないか

void OnCollisionEnter(Collision other){

Debug.Log ("OnCollisionEnter");

}

void OnTriggerEnter(Collider other){

Debug.Log ("OnTriggerEnter");

}

OnCollisionEnter(Stay、Exit)
OnTriggerEnter(Stay、Exit)
Collisionのsがtになってたり、TriggerをTrrigerと間違ってるとかがよくある
また、
OnCollision系の関数の引数の型はCollision
OnTrigger系の関数の引数の型はCollider
であることに注意(間違ってたら実行中にエラー出ると思う)

  • 使用している物理系が2Dなのか3Dなのか

上記に書いたOnCollisionEnterやOnTriggerEnter、
使ってる物理系が普通のRigidbodyなら問題ないが、
2D用の物理挙動 Rigidbody2Dを使用している場合は次のようになる

void OnCollisionEnter2D(Collision2D other){

Debug.Log ("OnCollisionEnter2D");

}

void OnTriggerEnter2D(Collider2D other){

Debug.Log ("OnTriggerEnter2D");

}

関数の最後や引数の型が2Dとなることに注意
また、3D用の物理挙動と2D用の物理挙動の当たり判定は取れないので
ゲームを作るときはどっちの物理挙動を使うのか統一するのが良い

とりあえずこれぐらい。CharactorController周りの当たり判定のことを
書かなかったけど、これだけ確認すれば大抵解決すると思う

明日は へーる です

コメント欄を読み込み中