Android
Unity,
C#,

【Unity】AwakeとStart


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は、他者も関係する初期化を行って良い

こんな感じのルールを作っておけば、問題ないのではないかと思います。

いや~、実機でしかエラーが起きないから

テストのたびにビルドしなきゃいけなくて、時間がかかりました(^^;