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");
}
ちなみに参考にしたのが以下の本です。
- 作者: 北村愛実
- 出版社/メーカー: 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を使えばいいんじゃないの?と思います。厳密な判定はできますが、使っているパソコンのスペック、そして、時間によっては挑戦しないほうが無難な気がします。