ブログ休止前の記事に引き続いてInputの正しい用法についてUnity Gemsからの翻訳を投稿する:
-------
http://unitygems.com/mistakes1/
October 15, 2012
Inputの正しい用法
Unity初心者がよく悩むこととして「Inputがどうして正しく読めなかったんだろう?」があげられる。ドキュメントどおりに設定したはずなのに何故か動かない。大体において、問題はInputを通して物理エンジンを作用させるときに問題が起きる。PhysicsはFixedUpdateに配置するものなので、そこにInputも配置すれば良いだろう、とおもって。そこが大きな勘違いなのである。Updateはマシン依存であり、言い換えると各々のマシンによりプロセッサ処理能力の違いやマシン上の他のプロセスなどによってでフレームレートが異なってくるのである。
FixedUpdateはユーザ依存である。メニューからEdit→Project Settings→Physicsと選択することでPhysics Managerを用いて値修正を行うことが出来る。Fixed Timestepsは0.02(50FPS)がデフォルト値である。より小さな値を設定することはFixedUpdateをより頻繁に動作させる結果になる。値はあくまで希望であって、実際にはマシンがその速度で動作できるかは別問題であることに留意する必要がある。
UpdateとFixedUpdateはそれぞれ独立して動作するため、一つのUpdateに対して:一つ、あるいは二つ、あるいはゼロ個のFixed Updateが対応することになる。仮にマシンが100fpsで動作したとしてFixedUpdateが50fpsの場合は二つのUpdateに対してFixedUpdateは一つしか対応しないことになる。
誤った使用例:
using UnityEngine;
public class Test:MonoBehaviour{
void FixedUpdate(){
if(Input.GetKeyDown(KeyCode.Space)){
//Action
}
}
}
正しい使用例:
using UnityEngine;
public class Test:MonoBehaviour{
bool action = false;
void Update(){
if(Input.GetKeyDown(KeyCode.Space)){
action = true;
}
}
void FixedUpdate(){
if(action){
//Action
action = false;
}
}
}
Updateに含まれるInputは毎フレームチェックされることが保証されているのでInputが無視されることはない。変数がUpdateで修正され、次のFixedUpdateがコールされる都度使用される。booleanをfalseにすることでactionが無制限に繰り返されないようにしている。
---------
PhysicsはFixedUpdateで記述しないといけないところは良く知られているが、仕組みを正しく理解する必要があることをあらためて認識される。
マルチスレッドのプログラミングとおもえば当然かもしれないが重要なところ。
ポイントを押さえてUnityを学習しようぜ!
0 件のコメント:
コメントを投稿