前置き
- Awake=インスタンス生成時処理だと思って実装してきた
- そしたら違かった
- 親子関係含めてどういう挙動なのか再確認したくなった
結論
- Awakeはインスタンス化後、初めてActiveになったタイミングで実行される。
環境
- Unity 2018.4.1f1
実験スクリプト
AwakeTest.cs
using UnityEngine;
public class AwakeTest : MonoBehaviour
{
public string objectName = null;
void Awake()
{
Debug.Log("Awake!" + objectName);
}
}
objectNameはどのオブジェクトかを判別するために使用。
挙動確認
0. 前提
こんな感じでGameObject/Cube/Sphereに上記のスクリプトをアタッチして、ObjectNameにはオブジェクト名をそのまま設定しておく。
GameObject/Cube/Sphereのactive状態を切り替えての実験。
1.初めからActive
生成と同時にActive状態なので、実行後すぐ呼び出される!
2.初めはDeactive
インスタンス生成後、はじめにActiveになったタイミングでの実行は本当だった。
3.子要素だけ一部Deactive
4.それでも僕はインスタンス化直後に処理を書きたいんだ!
スクリプトの修正
コンストラクタ定義してみるは?
AwakeTest.cs
using UnityEngine;
public class AwakeTest : MonoBehaviour
{
public string objectName = null;
public AwakeTest()
{
Debug.Log("Init!" + objectName);
}
void Awake()
{
Debug.Log("Awake!" + objectName);
}
}
実験
3.子要素だけ一部Deactiveに該当する条件で、実行後に Init!Cube
って出力されれば勝ち!
- 実行時log
🤔...
基本MonoBehaviour継承するケースではイベント関数使いましょうということですね。(newするのもダメだし)
それでもどうしても……!という場合は、Prefab定義してInstantiateして生成直後に専用の処理呼び出すとか、やり方によってはできそうな雰囲気。
再度結論
- Awakeはインスタンス化後、初めてActiveになったタイミングで実行される。
- Unity使う以上、Unityの鉄則に従おう。