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周りの当たり判定のことを
書かなかったけど、これだけ確認すれば大抵解決すると思う
明日は へーる です