[Unity] AddForceの実行タイミングについて

Unityを扱っているときに嵌ったことのメモです。

Rigidbodyを使ったGameObjectに対してRigidbody.AddForce()メソッドで力や加速度を加えたい場合、以下のようにして毎フレーム呼び出されるコールバックの中で処理を行うとします。

void Update() {
    var body = GetComponent<Rigidbody>();
    body.AddForce(force, ForceMode.Force);
}

しかし、このUpdate()メソッド内で呼び出した場合、FPSが固定でない場合に物体の動きが変わってしまう場合があります。
FPSが高いときは強い力が加わり、FPSが小さいときは力が弱くなってしまいます。
これは、AddForceメソッドは固定のフレームレートで呼び出されることを想定して設計されているためです。

したがって、固定のフレームレートで呼び出されるFixedUpdate()メソッド内で呼び出すことで上記の問題は解決できます。

void FixedUpdate() {
    var body = GetComponent<Rigidbody>();
    body.AddForce(force, ForceMode.Force);
}

リファレンスにもこのことについて記載されていますが、見落としがちな注意点として挙げておきました。

■参考サイト
http://docs.unity3d.com/ScriptReference/MonoBehaviour.FixedUpdate.html