60fpsと30fpsで挙動が変わる不具合とそのコード

今作っているゲームでfps固定が大前提のコードを書いてしまったので、60fpsだと意図通りだが、30fpsだと意図に反した挙動になっていた。
Updateの中で時間処理せずに固定値を使って計算していたことが原因でした。
戒めのためにコードの差分を残しておきます。

悲しみのコード

gravityYの挙動は60fpsと30fpsで1秒間で2倍の差が出ます。 1f / deltaTime でfps計算してfpsの変動を吸収できるようにします。

-  gravityY = Mathf.Max(-5f, gravityY - 0.5f);
+ float fps = Inside(deltaTime, 0f, 1f) ? 1f / deltaTime : Application.targetFrameRate;
+ gravityY = Mathf.Max(-5f, gravityY - (0.5f * 60f / fps));

反省

60fps前提で実装をサクサク進めた結果、このような不具合が発生しました。 Update系の関数では必ずdeltaTimeでfpsの変動を吸収しましょう。