私たちのアプリ「ぴよ盛り」は、 丼にひよこをいくつ盛れるかを競うゲームアプリです。 ひよこを高く盛るために、ひよこ同士をくっつける必要があり、そこにFixedJointが使われています。
先日、このFixedJoint が硬くなる不具合(?)に見舞われまして、その不具合に対応した結果をまとめました。
Table of Contents
FixedJointが硬くなった
開発環境を、Unityを4から5にアップデートしたところ、FixedJointが硬くなり、ひよこを以前のように盛れなくなりました。
調べてみてわかったのですが、PhysxのバージョンアップによるFixedJointの仕様変更が不具合の原因のようでした。PhysXは Unityの内部物理計算エンジンで、NVIDIA製です。
Unityバージョン | PhysXバージョン |
---|---|
4 | 2 |
5 | 3 |
2018.3 | 3.4 |
2019.3 | 4.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点で解決するかもしれません。