--
--  --:--:--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

 スポンサー広告

08
2016  00:03:29

Awake()関数の正しい使い方

Awake()といえば初期化などによく使う、重要なイベント関数ですよね(・Д・)ノ
初期化にはStart()を使っている方もいるかもしれませんが僕はAwake()派です。(笑)


でも実際、詳しいところまでは気にしてなかったので今回色々試してみました!






1.Awake()が呼ばれるタイミング


Unityの公式リファレンスによると、Awake()が呼ばれるのは

「すべてのオブジェクトのインスタンス生成後、すべてのStart()の前」

とあります。

(参考 → Unity-スクリプトリファレンス:MonoBehaviour.Awake()


つまり、

オブジェクトがすべて配置される

すべてのAwake()が呼び出される

Start()が呼び出される


ってことですね。


要するに、GameObject.FindやGetComponentなどでオブジェクト・コンポーネントを参照することはAwake()内でも安全にできる!




ただし、どのスクリプト(オブジェクト)のAwake()が先に呼び出されるかというAwake()どうしの順序はランダムなようなので、他のスクリプトの変数の値を参照したりするのはAwake()ではやってはいけませんね。


例えば。

public class ScriptA : MonoBehaviour {
    public int numberA;

    void Awake(){
        numberA = 1;
    }
}

public class ScriptB : MonoBehaviour{
    ScriptA script;
    int numberB;

    void Awake(){
        script = GameObject.Find ("GameObject_name").GetComponent<ScriptA> ();
        numberB = script.numberA;
    }
}




ScriptAのAwake()の後にScriptBのAwake()が呼び出されれば問題はないのですが、
ScriptBのAwake()が先に呼び出されてしまった場合はscript.numberAがまだ初期化されていませんね。



もしこのような処理をしたい場合はScriptBをStart()にすると確実です。
Start()はすべてのAwake()の処理が終わってからしか呼び出されませんから。




ちなみにScriptBのGameObject.Findは確実に問題なく処理されます。






2.非アクティブ状態の場合


ゲームを作っている最中に知ったのですが、Awake()ってスクリプトを無効化しても処理されるんですよ。
ただし、アタッチされているGameObjectを非アクティブにすると処理されません。

public class AwakeCheck : MonoBehaviour {

    void Awake(){
        Debug.Log ("Awake");
    }
    void Update(){
        Debug.Log ("Update");
    }
}



こんな簡単なスクリプトを作って、実験してみます。



まずは普通に実行。

a.png
もちろん両方とも呼ばれました。Update()の方はたくさん呼ばれてましたけど。(笑)







aaa.png
次にコンポーネントのチェックを外して実行します。



aaaa.png
Update()はもちろん呼ばれませんでしたが、Awake()はスクリプトを無効化したにもかかわらずしっかり呼ばれています。
なかなかしぶといヤツです(笑)








aaaaa.png
そしてコンポーネントのチェックを戻し、GameObjectのチェックを外してみます。

aaaaaa.png
今度はAwake()も呼ばれませんでした!




この後実行中にGameObjectをアクティブにするとAwake()とUpdate()が呼び出されましたが、もう一度非アクティブにしてからアクティブにしたときにはAwake()が呼び出されませんでした。





要は ”アタッチされているGameObjectが最初にアクティブになった後” に呼び出されるってわけですね(=゚ω゚)ノ




ここらへんの少し詳しいことが分かってないと、初期化トラブルが起きたりしそうなので注意が必要そうです。
関連記事
スポンサーサイト

 Unity備忘録

- 0 Comments

Leave a comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。