Blenderで作った3Dモデルで衝突判定が行われない問題(Unity)
Unityでの自作3Dモデルの衝突判定方法をメモします。
このような3DモデルをBlenderで作ったのですが、すり抜けるどころか衝突判定すら行われませんでした。
はじめにやったこと
今回、このお魚さんに球体を近づけて衝突判定させたいので、まずはお魚にMesh Collider
を、球体にSphere Collider
とRigidbody
を追加しました。次にお魚のMesh Collider
のMeshが"None(Mesh)"になっているので、右端の〇を押してこのモデルのメッシュを選択しました。
Colliderは以下のページがすごく参考になります。
次に球体にアタッチしているスクリプトに以下の内容を追加して衝突したらConsoleにHit
と表示するようにしました。
// updateの外側に記述 // Is Triggerにチェックが付いているとき void OnTriggerEnter(Collider other) { Debug.Log("Hit"); } // Is Triggerにチェックが付いていないとき void OnCollisionEnter(Collision collision) { Debug.Log("Hit2"); }
ちなみに参考にしたのが以下の本です。
Unityの教科書 Unity 2018完全対応版 2D&3Dスマートフォンゲーム入門講座
- 作者: 北村愛実
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2018/06/21
- メディア: Kindle版
- この商品を含むブログを見る
この本が衝突判定について一番わかりやすく書かれていると思います。
しかし、衝突判定が行われません。
Rigidbody
、Collider
の設定をいじりまくる
そこでRigidbody
のCollision Detectionをいろいろ変えてみました。
これも全然ダメ。
次にMesh body
のConvexの設定をいじってみるもうまくいかず。
そのほか、お魚にもRigidbody
をつけてみたり、いろいろいじってみるもダメ。
SAColliderBuilderを試してみる。
いろいろ調べてたら、以下のサイトでSAColliderBuilder
のことが言及されていました。
そこでUnityのアセットストアからこれをインポートしました。
使い方は、Unityの中のProject -> SAColliderBuilder -> Turoeial_jp.pdfの中に日本語で詳しく書かれています。
まずは、初期設定で Collider をつけてみました。
SAMeshColliderBuilderはインポートした後ならAdd Componentから追加できます。追加して、右下のProcess を押すとColliderが付きます。
ちょっと、Colliderが外側にはみ出しているので設定を変えてやり直します。
今度は以下のような設定です。
その結果がこちら
めちゃくちゃ緻密に設定されましたが重すぎてUnityがスムーズに動きません。ちなみに、1時間ぐらいCPU(Core i9-9900K)がシングルコアでフル稼働していました。
次は以下のように設定してみました。
そして以下のようになりました。
今度はかなり軽量でUnityもサクサク動きます。しかし、設定されるまで4時間かかりました。こんどはCPU(Core i9-9900K)全コアがフル稼働です。
結論(個人的感想)
判定に厳密さを求めないのであれば、Box Colliderを使えばいいんじゃないの?と思います。厳密な判定はできますが、使っているパソコンのスペック、そして、時間によっては挑戦しないほうが無難な気がします。