「喰う・書く・逃げる」に棲む処

 動物に関するデータ分析者のブログです

Blenderで作った3Dモデルで衝突判定が行われない問題(Unity)

Unityでの自作3Dモデルの衝突判定方法をメモします。

f:id:KRHB:20190710124139p:plain
自作3Dモデル

このような3DモデルをBlenderで作ったのですが、すり抜けるどころか衝突判定すら行われませんでした。

はじめにやったこと

今回、このお魚さんに球体を近づけて衝突判定させたいので、まずはお魚Mesh Colliderを、球体Sphere ColliderRigidbodyを追加しました。次にお魚Mesh ColliderMesh"None(Mesh)"になっているので、右端の〇を押してこのモデルのメッシュを選択しました。

Colliderは以下のページがすごく参考になります。

tech.pjin.jp

次に球体にアタッチしているスクリプトに以下の内容を追加して衝突したらConsoleにHitと表示するようにしました。

// updateの外側に記述

// Is Triggerにチェックが付いているとき
void OnTriggerEnter(Collider other)
    {
        Debug.Log("Hit");
    }

// Is Triggerにチェックが付いていないとき
void OnCollisionEnter(Collision collision)
    {
        Debug.Log("Hit2");
    }

ちなみに参考にしたのが以下の本です。

この本が衝突判定について一番わかりやすく書かれていると思います。

しかし、衝突判定が行われません。

RigidbodyColliderの設定をいじりまくる

そこでRigidbodyCollision Detectionをいろいろ変えてみました。

kimama-up.net

これも全然ダメ。

次にMesh bodyConvexの設定をいじってみるもうまくいかず。

appdeappuappu.hateblo.jp

そのほか、お魚にもRigidbodyをつけてみたり、いろいろいじってみるもダメ。

SAColliderBuilderを試してみる。

いろいろ調べてたら、以下のサイトでSAColliderBuilderのことが言及されていました。

qiita.com

そこでUnityのアセットストアからこれをインポートしました。

assetstore.unity.com

使い方は、Unityの中のProject -> SAColliderBuilder -> Turoeial_jp.pdfの中に日本語で詳しく書かれています。

まずは、初期設定で Collider をつけてみました。

f:id:KRHB:20190710132703p:plain
初期設定

SAMeshColliderBuilderはインポートした後ならAdd Componentから追加できます。追加して、右下のProcess を押すとColliderが付きます。

f:id:KRHB:20190710133432p:plain
付けられたCollider

ちょっと、Colliderが外側にはみ出しているので設定を変えてやり直します。

今度は以下のような設定です。

f:id:KRHB:20190812115008p:plain

その結果がこちら

f:id:KRHB:20190812115332p:plain

めちゃくちゃ緻密に設定されましたが重すぎてUnityがスムーズに動きません。ちなみに、1時間ぐらいCPU(Core i9-9900K)がシングルコアでフル稼働していました。

次は以下のように設定してみました。

f:id:KRHB:20190812115645p:plain

そして以下のようになりました。

f:id:KRHB:20190812115723p:plain

今度はかなり軽量でUnityもサクサク動きます。しかし、設定されるまで4時間かかりました。こんどはCPU(Core i9-9900K)全コアがフル稼働です。

結論(個人的感想)

判定に厳密さを求めないのであれば、Box Colliderを使えばいいんじゃないの?と思います。厳密な判定はできますが、使っているパソコンのスペック、そして、時間によっては挑戦しないほうが無難な気がします。