For some time I’ve been trying to resolve the physics issues after upgrading GearBlocks to Unity 5. I’ve had success with some issues, not so much with others. I’ll sum up where I’ve gotten things to so far.
Rigidbody rotation unfreezing
When unfreezing a rigidbody, its rotations weren’t being unfrozen, this bug happens if you had already modified the rigidbody’s inertia tensor. After submitting a bug report, I heard back from Unity – turns out the workaround is to restore the inertia tensor after unfreezing, which works fine.
Collision contact tolerance
The collision contact tolerance seems to have significantly changed with Unity 5. What I thought was my gear constraints not working properly was actually due to the moving parts (blocks, axles and gears) within a construction colliding with each other, and everything was getting all jammed up. One workaround I tried was to shrink the colliders, trouble is I had to shrink them by quite a large amount and even then I’d still get occasional unwanted collisions. Another option would be to disable collisions altogether between neighbouring parts, but that’s problematic as you might actually want them to collide in certain situations.
Unstable collision behaviour
For some constructions when contacting the ground, their collision response with the ground is kinda jittery and they keep bouncing around for ages after the initial collision. After some experimenting, it seems this behaviour is worse with the small fixed update (i.e. physics update) time step I’m using (5ms vs. the default 20ms). Not much I can do about that though, as I need the smaller time step for accuracy with fast spinning stuff.
Instability at high angular velocities
On the subject of fast spinning stuff, despite the aforementioned small time step (and also a high solver iteration count), gears / axles spinning a high rpm now become unstable and start wobbling around. With the same settings in Unity 4 this was rock solid. I tried playing around with these settings but I couldn’t get it to be stable, more experimentation is required, but this could be a real show stopper.
Hinge joint motors
When switching on a joint motor, there is a bug in Unity 5 that means the connected rigidbodies don’t get woken up, and so they don’t start moving if stationary. The workaround is to explicitly wake up the rigidbodies when turning the motor on. I also found I had to multiply my torque values by a factor of around 50 to get similar behaviour to that in Unity 4.6.
Hinge joint limits
I use angular limits to force a hinge joint to a particular angle by setting the limit min and max values both to that angle, but this stopped working properly in Unity 5. I found the fix was simply to ensure there is a small delta between the min and max.
Configurable joint velocity drives
I still can’t get these to work at all, I submitted a bug report to Unity but haven’t heard back so far. Hopefully they’ll be able to fix this one.
In summary, I’ve got fixes / workarounds in hand for most issues now, but there are still a couple of show stoppers (namely velocity drives and stability at high angular velocities). So for now I’m still sticking with Unity 4.6, I really need to get back to making actual progress on the game!