キーボードによる操作 (5/5)
作成:2014-09-06 10:44
更新:2014-09-06 10:44
更新:2014-09-06 10:44
■Time.deltaTimeによる移動量の調整
実際にGetKeyやGetAxisを使ってキャラクタを動かせるようになると、何か具体的なゲームを作ってみたくなります。そして、友だちなどさまざまな人に試してみてもらいたくなるでしょう。そうすると、予想外の苦情がドッと押し寄せてくるはずです。「キャラクタの動きが速すぎてゲームにならない!」「いや、動きが遅くてかったるい!」と。
なぜ、こんな正反対の苦情が来るのか。それは「ハードウェアごとのスピードの違い」に対応させていないからです。Unityでは、画面が更新されるごとにUpdateメソッドが呼び出され、そこでInputを使った入力のチェックと移動を行うことになります。
速いマシンと遅いマシンとでは、1秒当たりにUpdateが呼び出される回数も当然違ってきます。1秒に10回しかUpdateされないマシンと、毎秒100回もUpdateが呼び出されるマシンとでは、Updateされる回数は10倍も違います。ということは、その中の移動する処理が実行される回数も10倍違ってくるわけです。
こうしたハードウェアの違いを吸収するために用いられるのが、「Time.deltaTime」というものです。Timeは、時間に関するクラスで、deltaTimeは「前回Updateが呼ばれてからの経過時間」を示すプロパティです。
速いマシンほどUpdateが呼び出される間隔は短くなりますからdeltaTimeの値は小さくなります。遅いマシンではUpdateされる間隔も長くなるのでdeltaTimeの値は大きくなるのです。ということは、このdeltaTimeの値を移動量にかけてやれば、速いマシンでも遅いマシンでも一定の移動量で動かすことができるわけです。
下に、先ほどのGetAxisを使ったサンプルを書き直したものを挙げておきます。これで、ハードウェアが違っても同じスピードでキャラクタが動くようになります。ここではfloat d = Time.deltaTime;として値を取り出しておき、それをかけあわせた値をVector3のxとzに設定してtransform.positionに代入しています。こうして調整することでスピードの違いを吸収できるのですね。
なぜ、こんな正反対の苦情が来るのか。それは「ハードウェアごとのスピードの違い」に対応させていないからです。Unityでは、画面が更新されるごとにUpdateメソッドが呼び出され、そこでInputを使った入力のチェックと移動を行うことになります。
速いマシンと遅いマシンとでは、1秒当たりにUpdateが呼び出される回数も当然違ってきます。1秒に10回しかUpdateされないマシンと、毎秒100回もUpdateが呼び出されるマシンとでは、Updateされる回数は10倍も違います。ということは、その中の移動する処理が実行される回数も10倍違ってくるわけです。
こうしたハードウェアの違いを吸収するために用いられるのが、「Time.deltaTime」というものです。Timeは、時間に関するクラスで、deltaTimeは「前回Updateが呼ばれてからの経過時間」を示すプロパティです。
速いマシンほどUpdateが呼び出される間隔は短くなりますからdeltaTimeの値は小さくなります。遅いマシンではUpdateされる間隔も長くなるのでdeltaTimeの値は大きくなるのです。ということは、このdeltaTimeの値を移動量にかけてやれば、速いマシンでも遅いマシンでも一定の移動量で動かすことができるわけです。
下に、先ほどのGetAxisを使ったサンプルを書き直したものを挙げておきます。これで、ハードウェアが違っても同じスピードでキャラクタが動くようになります。ここではfloat d = Time.deltaTime;として値を取り出しておき、それをかけあわせた値をVector3のxとzに設定してtransform.positionに代入しています。こうして調整することでスピードの違いを吸収できるのですね。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
void Update () { this.transform.Rotate(1, 1, 1); float d = Time.deltaTime; float x = Input.GetAxis("Horizontal"); float y = Input.GetAxis("Vertical"); Vector3 v = this.transform.position; v.x += x * d * 5; v.z+= y * d * 5; this.transform.position = v; }
※関連コンテンツ