箱庭ハーブblog

7年目プログラマの趣味の小部屋

UnityのStartとAwakeの違い

UNITY、Unity、unity、Start、start、Awake、awake



基本的に、順序詳細に関しては下記URLを見れば分かります。

公式はここ
https://docs.unity3d.com/ja/current/Manual/ExecutionOrder.html

unity-の-instantiate-と-awake-とか-startが流れるタイミングを把握する
http://jigax.jp/unity-の-instantiate-と-awake-とか-startが流れるタイミングを把握する/

概要

・前提
非アクティブは未考慮

・要約
1. 公式のInitialization中にInstantiateされたオブジェクトは、同フレーム中にUpdateする。
  ただし、事実上シーンロード直後の第1フレームでしかこの状況は発生しない(※1)
2. 公式のGame Logic中にInstantiateされたオブジェクトは、同フレーム中にUpdateしない(※2)
3. AwakeはInstantiateが返る前に呼ばれる
4. StartはInstantiateを呼び出した呼び出し元の大元(※3)が終わるまで呼ばれない
5. 公式のGame Logic中にInstantiateされたオブジェクトは、同フレーム中にStartする

・Instantiate詳細
1. Behaviourコンストラクタ(アタッチされたコンポーネント群のうちの1つである。)
2. Behaviourインスペクタの読み込み
3. 他のアタッチされたコンポーネントを含む初期化が完了し、取得が許可される
4. BehaviourのAwake
5. Instantiateが戻り値を返す
6. Instantiateを呼び出した呼び出し元の大元が終わるまで
7. BehaviourのStart
8. (InstantiateされたのがStart以前だった場合=シーンロード後の第1フレーム)BehaviourのUpdate

(※1)
2フレーム目以降は、Game Logic(呼び出し元がUpdateなど)でしかInstantiateされることはないので。

(※2)
FixedUpdate中のInstantiateは試していないので、知りたい場合は試すの推奨。

(※3)
全てのスクリプトは誰かのMonoBehaviourのAwake、Start、Updateあるいはコルーチンなどから呼ばれることになる。
その呼び出しが終わるまで、InstantiateされたオブジェクトのStartは呼ばれない

使い分け

Awakeがいい
・オブジェクト単体で完結する初期化
・Instantiateが返る前に初期化しておきたい内容

Startがいい
・Instantiate呼び出し元による加工(弾の方向や配置、親子関係バインド)してから処理したい

前提

例えばこんな時
・ScriptableObjectで発射システムを作った
・全く別に、加速弾やカーブを表現できるBehaviour&Serializableパラメータのペアを作った
  ・なお、このSerializableパラメータは初期方向や初期速度もある

組み方

普通に組めば、以下の順番
Instantiate > 配置・パラメータ調整 > ロジックへパラメータを渡す

ので、
・ロジック自体、あるいは関連部品のnewはAwakeで行う
・Serializableパラメータのロジックへの適用は、Startで行う
コメント
PAGETOPへ

コメント送信

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード

パスワードを入れておかないと、コメントの再編集ができません!

フリーエリア

takemori
Twitter : @takemori_kondo

1. Unityと戯れてます
2. Cake3は劣化じゃないRails

iOS
coming soon...

Windows
Html Editor - Nazuna
Managed DirectX サンプル集

beginning since
2006.08.17
renewaled on
2011.06.03

最新コメント

[2013/06/14 ミューネ]
[2012/08/30 ノートPC]