【Unity】Unity4→Unity5、20XXアップデートで FixedJointが硬くなった場合の対処方法

私たちのアプリ「ぴよ盛り」は、 丼にひよこをいくつ盛れるかを競うゲームアプリです。 ひよこを高く盛るために、ひよこ同士をくっつける必要があり、そこにFixedJointが使われています。

先日、このFixedJoint が硬くなる不具合(?)に見舞われまして、その不具合に対応した結果をまとめました。

FixedJointが硬くなった

開発環境を、Unityを4から5にアップデートしたところ、FixedJointが硬くなり、ひよこを以前のように盛れなくなりました。

調べてみてわかったのですが、PhysxのバージョンアップによるFixedJointの仕様変更が不具合の原因のようでした。PhysXは Unityの内部物理計算エンジンで、NVIDIA製です。

Unityバージョン PhysXバージョン
42
53
2018.33.4
2019.34.1

UnityとPhysXのバージョン対応表

フォーラムにも同様の声

UnityフォーラムとFogbugzでも、同様の 問題で困っている方の声があがっていました。

Joints in Unity 5 are very unstable – and it’s not just me! | Unity Community http://forum.unity3d.com/threads/joints-in-unity-5-are-very-unstable-and-its-not-just-me.319084/
FogBugz
http://fogbugz.unity3d.com/default.asp?689954_upr6627iri6lgof1

この問題に対するUnityの中の人からの回答は「これは不具合ではなくPhysxのバージョンアップによる仕様変更。修正はしないので、おまえらで調整してくれ。きっとうまくいくし、前よりいい感じに動くはず。」とのことで、開発環境側の修正は絶望的。

アプリの修正を試みる

ならばと、アプリ側の修正を試みることに。

最初に、Unity5のFixedJointを、Unity4のそれの挙動に近づけようと試みるも、調整できるパラメータに限りがあり断念。そこで、パラメータを自由に調整が可能なConfigurableJointを使うことに。

試行錯誤の結果、ほぼUnity4のFixedJoint に近い挙動のパラメータを発見。

しかし、扱うRigidBody数が50個くらいまでは、以前と近い挙動なのですが、それ以上に増えると、プルプル不自然に震え始めるように…。

再び試行錯誤の結果、RigidBodyの重さ(mass)を1/10に調整したところ、RigidBody数が100個以上になっても、以前と近い挙動を保つようになりました。

まとめ

Unity4から、Unity5やUnity20XXにアップデート後、FixedJointが硬くなって困っている方は、

・FixedJointを ConfigurableJoint に変更しパラメータ調整。
・JointするRigidBodyの重量を軽くする 。

の2点で解決するかもしれません。