libro
www.tuyano.com
JavaScriptではじめるUnityプログラミング入門

キーボードで操作しよう! (5/5)

作成:2014-05-03 10:33
更新:2014-05-03 10:33

■ハードによる移動量の違いを吸収する

これで、特定のキーに依存せず、ユーザーが設定したキーで動かせるようになりました。が! まだ問題が残っています。それは「動かすマシンによる移動量の違い」の問題です。

Unityは、フレームが切り替わるごとにUpdateが呼び出されます。ここに処理を記述してゲームオブジェクトを動かしています。

ここで忘れてはならないのが、「フレームの切り替わるスピードは、ハードウェアに依存する」という点です。強力なCPUが搭載されていれば1秒間に百数十回もフレームが切り替わるかもしれませんが、スマートフォンなどではせいぜい十数回しか切り替えできないかもしれません。

となると、Updateで同じ量だけ移動するように処理すると、「速いマシンほどものすごいスピードで移動する」ということになってしまうでしょう。

こうした、ハードウェアによる移動量の違いを吸収するにはどうすればいいか。これは、実は簡単です。下に、先ほどのスクリプトの修正版を挙げておきます。これだと、ハードウェアがどう変わっても同じスピードでゲームオブジェクトが動きます。ポイントは、最初にある以下の文です。
var delta = Time.deltaTime * 2;
Timeオブジェクトは、時間を扱うためのものです。この「deltaTime」は、前回フレームを表示してから現在のフレームを表示するまでにかかった経過時間を保管しているプロパティです。遅いマシンほどフレームの切り替えに時間がかかり、この値は大きくなります。つまり、この値をゲームオブジェクトの移動量に使うことで、早いマシンでは短く、遅いマシンでは長く移動するようになるのです。

ただし、そのままの値ではキャラクタの移動としてはちょっと遅いので、ここでは2倍にして利用しています。このあたりは、それぞれのゲームオブジェクトの移動スピードを考えて適当に値をかけて調整して使うとよいでしょう。

これでようやく、「どんなハードでも、どのキーを使っても、ちゃんと同じようにゲームオブジェクトを上下左右に動かすスクリプト」ができあがりです!

スクリプト自体は別に難しくはありませんが、なぜそうなるのか?という仕組みを理解しておくことはとても重要です。Time.deltaTimeInput.GetAxisがどういうものか、なぜそれを利用するのか、しっかり理解しておきましょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

function Update () {
    transform.Rotate(new Vector3(1, 1, 1));
    var delta = Time.deltaTime * 2;

    var x:float = Input.GetAxis("Horizontal") * delta;
    var y:float = Input.GetAxis("Vertical") * delta;
    
    transform.position.x += x;
    transform.position.y += y;
}
※関連コンテンツ

「JavaScriptではじめるUnityプログラミング入門」に戻る