LoginSignup
2
1

More than 3 years have passed since last update.

Awakeってインスタンス化直後に呼ばれるものじゃないの……?

Posted at

前置き

  • 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にはオブジェクト名をそのまま設定しておく。
image.png

GameObject/Cube/Sphereのactive状態を切り替えての実験。

1.初めからActive

  • 実行前のactive状態

    image.png

  • 実行時log
    image.png

生成と同時にActive状態なので、実行後すぐ呼び出される!

2.初めはDeactive

  • 実行前のactive状態
    image.png

  • 実行時log
    何もでない!
    image.png

  • 手動でGameObjectをActive
    image.png

  • Active後のlog
    image.png

インスタンス生成後、はじめにActiveになったタイミングでの実行は本当だった。

3.子要素だけ一部Deactive

  • 実行前のactive状態(CubeだけDeactive)
    image.png

  • 実行時log
    image.png
    Cubeだけ出ない!
    →CubeをActiveにすると、logもちゃんと出た。

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

image.png

🤔...

基本MonoBehaviour継承するケースではイベント関数使いましょうということですね。(newするのもダメだし)
それでもどうしても……!という場合は、Prefab定義してInstantiateして生成直後に専用の処理呼び出すとか、やり方によってはできそうな雰囲気。

再度結論

  • Awakeはインスタンス化後、初めてActiveになったタイミングで実行される。
  • Unity使う以上、Unityの鉄則に従おう。

参考

2
1
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
2
1