7
4

More than 3 years have passed since last update.

Start,Awake,Update,LateUpdate,FixedUpdateの違い

Posted at

UnityのStartとUpdateに似てるやつら

UnityにはStart()Awake()Update()LateUpdate()FixedUpdate()がある。
これらの違いと使いどころを考える

UnityでScriptを作るとStart()とUpdate()が自動で作られるだろう。
実は似ている機能がMonoBehaviourにはいくつかある。

機能 説明
Start Start はスクリプトが有効で、Update メソッドが最初に呼び出される前のフレームで呼び出されます
Awake スクリプトのインスタンスがロードされたときに呼び出されます
Update Update は MonoBehaviour が有効の場合に、毎フレーム呼び出されます
LateUpdate Behaviour が有効の場合、LateUpdate は毎フレーム呼びだされます
FixedUpdate MonoBehaviour が有効の場合、この関数は毎回、固定フレームレートで呼び出されます。

引用 Unity公式リファレンス
https://docs.unity3d.com/ja/2017.3/ScriptReference/MonoBehaviour.html

SatrtとAwakeについて

テストコード
image.png
StartとAwakeは1度だけ実行される。
また、Startは必ずAwakeの後に実行される。
image.png
面白いところは、AwakeはScriptがアクティブじゃなくても動く。
image.png
Satrtはアクティブになったときに1度だけ動く。
image.png
しかしScriptの親(Object)が非アクティブだとAwakeも動かない。
理由はこの時点ではScriptがインスタンス化されていないためと思われる、逆に言えばインスタンス化されたときにAwakeが動く。
image.png

SatrtとAwakeの使い分け

基本的にはStartだけでいいんじゃない?
Awakeは自身のScript内での初期化処理を担当
Startは外部からの参照を必要とする初期化処理担当

って考えるのがUnityの思惑だと思う。

参考文献

”AwakeでDestroyするとどうなるか”とかやってて面白い
https://dkrevel.com/unity-explain/how-to-call-start-awake-onenable/

Update,LateUpdate,FixedUpdateについて

Updateは毎フレーム呼び出される
LateUpdateはUpdate後に呼び出される
FixedUpdateはフレームレートを固定して実行できる

フレームって何ぞやって話になる
FPSはフレームパーセカンド、1秒当たりのフレーム数となる
フレームは処理1回分にあたる(正確には処理と描画)

Updateの罠

まずUpdateは徐々に何かしたいときにしか使わない
また時間を使いたいときはカウントする機能をUpdateで作るのではなくコルーチンを使う
繰り返し行う必要のないものは極力Updateの外に置く
もしくはIFを用いて動いてほしい時にだけ動くようにするべき
自分が実際にやらかして重くなったりした例

悪い例たち
int i = 0;
String str = "UIとかに表示したい文字列";
void Update(){
 //例1
 Transform transform = gameObject.GetComponent<Transform>();
 //Startに置いて1回だけするようにした方がいい

 //例2
 i++;
 if(i>100){
  Debug.Log("100回Updateしたら何かする。");
  i=0;
 }
 //コルーチンとか使った方がよさげ

 //例3
 XXXText.text = str;//UIとかのテキストを変えるコード
 //毎回描画するせいで、点滅することがある
 //文字列が変わったときに動くScriptを用意してあげるとよい
}
Public void ChangeText(){//変えたいときにこれを実行する
 XXXText.text = str;
}

Update3種の使い分け

でもなんで3種もあるの?って話
例:Updateで物体の移動とカメラ移動をする
コードにもよるかもしれないけど、物体の移動後にカメラを合わせたいのに物体の移動前にカメラがある、なんてことが起こりうる。
そこで、Updateに物体の処理、LateUpdateにカメラ処理をする
そうすると、LateUpdateはUpdateの後に実行されるので確実にカメラは追従する。
(公式リファレンスでもそんな感じの説明)
https://docs.unity3d.com/ja/2017.3/ScriptReference/MonoBehaviour.LateUpdate.html

FixedUpdateは何に使うん?って話
物理処理の正確さを重視する場合に有効
例えば速度1m/sで進む物体を用意する
Updateで作るといずれ誤差が生じる(Updateにフレームの概念はあっても時間の概念はないため)
FixedUpdateで作ると誤差なしで進む(1フレーム〇〇秒という時間概念があるため)
(公式リファレンスでもそんな感じの説明)
https://docs.unity3d.com/ja/2017.3/ScriptReference/MonoBehaviour.FixedUpdate.html

使い分けとしてはこんな感じ

  • Updateは普段使い
  • LateUpdateは処理に対して処理したいとき
  • FixedUpdateは正確な時間と距離を扱いたいとき

じゃあFixedUpdateで処理重くしたらどうなるの?
その答えは下のやつ呼んでください。面白いです。

参考文献
処理をクッソ重くして固定フレームレートの秒数が現実時間を超えるときどうなるか?みたいなことが書かれてる
https://dkrevel.com/unity-explain/fixedupdate-fixed-timestep/
image.png

初めて記事書きました、今後も書いていきたいです。

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4