1.

Non-convex MeshCollider with non-kinematic Rigidbody エラー対処

▶
この記事の要点
  • Unity 5 以降、凹形状(Convex でない)の MeshCollider を、物理演算で動く Rigidbody と一緒に使えなくなった
  • 対処 1: MeshCollider の Convex にチェック(形状は凸包に近似される)
  • 対処 2: Rigidbody の Is Kinematic にチェック(物理で動かさずスクリプトで動かす)
  • 対処 3: 動かない物体なら Rigidbody を削除する
  • 形状を保ったまま物理で動かしたいなら、Box / Sphere / Capsule などの複合コライダーに置き換えるのが定石

エラー内容

Unity のコンソールに次のエラーが表示され、対象オブジェクトの衝突判定が正しく動作しません。

Non-convex MeshCollider with non-kinematic Rigidbody is no longer supported in Unity 5.
If you want to use a non-convex mesh either make the Rigidbody kinematic or remove the Rigidbody component. Scene hierarchy path "MyAircraft", Mesh asset path "~"

メッセージの意味は「凸でない MeshCollider と、キネマティックでない Rigidbody の組み合わせは Unity 5 からサポートされなくなった。凹形状のメッシュを使いたいなら Rigidbody をキネマティックにするか、Rigidbody コンポーネントを削除せよ」です。Scene hierarchy path にエラーの出ているオブジェクト名(この例では MyAircraft)、Mesh asset path に使われているメッシュのファイルが表示されるので、まずそこを確認します。

原因

同じ GameObject(または子オブジェクト)に次の 2 つが同時に付いていることが原因です。

  • MeshCollider で Convex のチェックが外れている(=モデルのポリゴン形状そのままの凹形状コライダー)
  • Rigidbody で Is Kinematic のチェックが外れている(=重力や力で動く動的な剛体)

Unity の物理エンジン(PhysX)では、動的な剛体同士の衝突計算は凸形状を前提にしています。凹形状のメッシュ同士の衝突計算は非常に重く不安定なため、Unity 5 で PhysX 3 系に移行した際にこの組み合わせが禁止されました。凹形状の MeshCollider は「動かない地形や建物」に使うもの、と覚えておくと判断しやすくなります。

なお、Is Trigger を有効にした MeshCollider も Convex が必須です。トリガーとして使いたい場合も同じ考え方で対処します。

対処法

オブジェクトを「物理演算で動かしたいか」「形状の正確さが必要か」で対処を選びます。

対処向いているケースデメリット
MeshCollider の Convex にチェック重力・衝突で自然に動かしたい小物や乗り物凹みが埋まった形(凸包)になる。メッシュの三角形数に上限がある
Rigidbody の Is Kinematic にチェックスクリプトやアニメーションで位置を動かすもの(動く床、エレベーター等)重力や他の物体からの力では動かなくなる
Rigidbody を削除地形・建物・壁など動かないものそのオブジェクトは物理で一切動かない
プリミティブコライダーの組み合わせに置き換え形状の再現と物理挙動の両方が必要な場合(飛行機、車体など)コライダーの配置作業が必要

対処 1: Convex にチェックを入れる

  1. Hierarchy でエラーの出ているオブジェクトを選択する
  2. Inspector の Mesh Collider コンポーネントで Convex にチェックを入れる
  3. Scene ビューで緑色のコライダー形状を確認し、凹みが埋まっても問題ないかを見る

Convex を有効にすると、Unity はメッシュを包む凸形状(凸包)を自動生成します。このとき使える三角形数には上限(255)があり、細かいメッシュは簡略化されます。カップの内側やトンネルのような「中に入る」形状は埋まってしまうので注意が必要です。

対処 2: Is Kinematic にチェックを入れる

Inspector の Rigidbody で Is Kinematic にチェックを入れます。キネマティックな剛体は物理演算では動かず、transform や Rigidbody.MovePosition でスクリプトから動かします。他の動的な剛体を押し出すことはできるため、動く床や扉などに向いています。

対処 3: 複合コライダーに置き換える

エラー例の「MyAircraft」のように、飛行機を物理で飛ばしつつ形状もある程度再現したい場合は、MeshCollider をやめて子オブジェクトに Box Collider や Capsule Collider を複数配置します。親に Rigidbody を 1 つ付ければ、子のコライダーはまとめて 1 つの剛体として扱われます(複合コライダー)。

MyAircraft            (Rigidbody)
├── Body              (Capsule Collider)  胴体
├── WingL             (Box Collider)      左翼
├── WingR             (Box Collider)      右翼
└── Tail              (Box Collider)      尾翼

プリミティブコライダーは計算が軽く挙動も安定するため、ゲーム全体のパフォーマンス面でも有利です。

スクリプトから設定する場合

実行時にメッシュを差し替えるなど、コードで設定する場合は次のように書きます。

using UnityEngine;

public class ColliderSetup : MonoBehaviour
{
    void Awake()
    {
        var meshCollider = GetComponent<MeshCollider>();
        var rb = GetComponent<Rigidbody>();

        if (meshCollider != null && rb != null && !rb.isKinematic)
        {
            // 動的な Rigidbody と組み合わせるなら Convex 必須
            meshCollider.convex = true;
        }
    }
}

確認方法

  1. コンソールをクリア(Clear)してから再生し、同じエラーが出ないことを確認する
  2. Scene ビューで Gizmos を表示し、緑色のコライダー形状が意図した範囲になっているか確認する
  3. 他のオブジェクトとぶつけて、すり抜けや不自然な跳ね返りがないか試す

エラーが消えない場合は、子オブジェクトにも MeshCollider が付いていないかを確認してください。親に Rigidbody があると、子の MeshCollider も同じ制約を受けます。

よくある質問

Unity 4 のプロジェクトを開いたら大量に出るようになった

Unity 4 までは許可されていた組み合わせのため、古いプロジェクトやアセットをアップグレードすると表面化します。上記の対処をオブジェクトごとに適用してください。

地形(Terrain)や建物にも Rigidbody が付いている

動かないオブジェクトには Rigidbody は不要です。削除すれば凹形状の MeshCollider のまま使えます。

関連

子ページ

子ページはありません

同階層のページ
  1. Non-convex MeshCollider with non-kinematic Rigidbody is no longer supported in Unity 5.
  2. Script error: OnCollisionEnter