2020/11/09
というわけで、今回はタイトル通り「Cloth コンポーネントを削除しようとするとUnityが落ちる」という現象で少し詰まったので、そのお話です。Unity のバージョンは 5.5.2f1 です。
結論から言えば、「オブジェクトを非アクティブにしてから削除→再起動→再設定」でいけます。
なので対処法というほど大袈裟なものではありませんが、ちょっとしたメモとして載せておきます。
現象
Clothコンポーネントを「RemoveComponent」で削除しようとすると、Unity が強制終了してしまいます。
Cloth が設定されているオブジェクトは、ウサギのキャラクターについているマフラーです。
形の割に頂点数は多めですが、それ以外はほとんどいじっていません。
再現率は今のところ100%です。
なんとかなった方法
自分の場合になりますが、試した感じでは以下の方法で何とかなるようです。
1.以下のどちらかの方法で Cloth コンポーネントを削除
・SkinnedMeshRenderer コンポーネントを非アクティブにしてから Cloth を 削除
・Cloth が設定されているオブジェクトを非アクティブにしてから Cloth を 削除
2.上の状態で保存後、Unity を再起動
3.非アクティブにしたコンポーネントorオブジェクトをアクティブにする
4.再度 Cloth を設定し直す
要するに「オブジェクトが画面上に描画されない」状態にすることがポイントです。
シーンビューでこんな感じになっていることを確認し、RemoveComponent で Cloth を削除しましょう。また、再起動前にアクティブにするとクラッシュしてしまうので注意します。
ちなみにクラッシュ時のスタックトレースはこんな感じ。
0x00000001408A953A (Unity) Unity::Cloth::SetUpSkinnedBuffers 0x00000001408A9CFC (Unity) ClothModule::SetUpSkinnedBuffersOnSkinnedCloth 0x0000000140B15767 (Unity) SkinnedMeshRenderer::UpdateAllSkinnedMeshes 0x00000001408A5D99 (Unity) UpdateCloths 0x00000001408A5E27 (Unity) UpdateCloths 0x0000000140BC3097 (Unity) PlayerLoop 0x000000014148C232 (Unity) Application::UpdateScene 0x000000014148D7FF (Unity) Application::UpdateSceneIfNeeded 0x00000001414960B4 (Unity) Application::TickTimer 0x0000000141558FFE (Unity) FindMonoBinaryToUse 0x000000014155A621 (Unity) WinMain 0x0000000141875DD4 (Unity) strnlen 0x00007FFB07F28364 (KERNEL32) BaseThreadInitThunk 0x00007FFB087F70D1 (ntdll) RtlUserThreadStart
SkinnedMeshRenderer → Cloth ときて落ちているので、削除後の SkinnedMeshRenderer の再描画が怪しそうです。
もちろん確定ではありませんが、解決したので深く考えないようにします。
まとめ
そんなわけで、ちょっとした Unity のトラブルに関するお話でした。
他のアプリケーションは落ちた原因が比較分かりやすいのですが、Unity はなかなか厳しいです。
自分が変な設定をしていたり、インポートしたデータの問題である可能性もあるので、様々な視点から疑っていくべきですね。