12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Unity】AwakeとStart

Posted at

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

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

いや~、実機でしかエラーが起きないから
テストのたびにビルドしなきゃいけなくて、時間がかかりました(^^;

12
6
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
12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?