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

#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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/b6aba0d1-dac8-5012-6f84-9a280963e93c.png)
StartとAwakeは1度だけ実行される。
また、Startは必ずAwakeの後に実行される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/e72f34ea-3fdf-a32c-c0e8-2fb479c9cf0b.png)
面白いところは、AwakeはScriptがアクティブじゃなくても動く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/477a356a-d3c0-565e-b3f9-5dc9b85c7234.png)
Satrtはアクティブになったときに1度だけ動く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/2c911756-078a-bbac-c6d3-f590a4ebc842.png)
しかしScriptの親(Object)が非アクティブだとAwakeも動かない。
理由はこの時点ではScriptがインスタンス化されていないためと思われる、逆に言えばインスタンス化されたときにAwakeが動く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/32be69df-9fb3-a6e7-2eb0-a6db62bec318.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を用いて動いてほしい時にだけ動くようにするべき
自分が実際にやらかして重くなったりした例

```cs:悪い例たち
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505183/cffd1e2c-48b1-c444-6e9a-f0c3719cd487.png)

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