#AwakeとStart
Unityのイベント関数でよく使うものの中に、AwakeとStartがあります。
どちらも初期化関数なのですが、次のような違いがあったりします。
Awake
- 最初のシーンのロード
- この関数は常に Start 関数の前およびプレハブのインスタンス化直後に呼び出されます。(もしゲームオブジェクトがスタートアップ時に無効である場合、有効になるまで Awake は呼び出されません。)
(Unity公式ページより引用)
Start
- 最初のフレームのアップデート前
- スクリプトのインスタンスが有効な場合にのみ、最初のフレームのアップデート前に Start が呼び出されます。
(Unity公式ページより引用)
ことの発端
初期化っぽいイベント関数が二つあるのは知ってた。
StartよりもAwakeの方が先に呼ばれるであろうことも知ってた。
てことで、なんとなくAwakeばっかり使っていたのですが
プログラムをちょっと変更したら、UnityEditor上では動いていたプログラムが
実機(Android)では動かなくなってしまいました。
プログラムの作り(変更前)
-
GameDirectorオブジェクト
-
Scene上にインスタンスとして配置
-
Playerの走行ルートや、Enemyの発生を管理する
-
UIの管理
-
Awake内でPlayerの走行ルートをセット。Startなし。
-
Playerオブジェクト
-
Scene上にインスタンスとして配置
-
設定された走行ルート上を自走する
-
Awake内で初期化を行う。Startなし。
プログラムの作り(変更後)
-
GameDirectorオブジェクト
-
変更なし
-
Playerオブジェクト
-
Prefab化した後、Scene上にインスタンスとして配置
-
そのほか、変更なし
UnityEditor上と実機上での動きの違い
PlayerのAwakeでは、各種初期化を行っています。
GameDirectorのAwakeで行う走行ルートセットは、
Playerの初期化後に呼ばれる前提でした。
修正前のプログラムでは、UnityEditorとAndroid共に
GameDirectorのAwakeより先にPlayerのAwakeが呼ばれていたようです。
それが、PlayerオブジェクトをPrefabしたことで
Awakeの呼ばれる順番(=インスタンス化の順番?)が変わってしまったようです。
しかも、UnityEditorとAndroidとで異なる。
※処理速度の問題??
結論
- Awakeは、自分の初期化のみ
- Startは、他者も関係する初期化を行って良い
こんな感じのルールを作っておけば、問題ないのではないかと思います。
いや~、実機でしかエラーが起きないから
テストのたびにビルドしなきゃいけなくて、時間がかかりました(^^;