Startのコルーチン完了後にUpdate処理を開始したい
Unityのコールバック、例えばStartやOnTriggerEnter等は実はコルーチンにする事が出来ます。
で、Startをコルーチン化して処理をある程度遅延する訳ですが、ここで問題になるのが「Start完了前にUpdateが呼ばれてしまう」事実です。
例えばサンプルや動作検証で「AssetBundleをダウンロードし展開、終了後にキー入力のタイミングでインスタンス生成」みたいな処理を行いたい場合、「ダウンロード完了前にインスタンス生成しようとしてしまう」コードを書けます。
遅延処理が完了するまでUpdateを呼ばない
ということで、タイトルのコレを行います。
どうやるかと言えば、UnityにおけるコルーチンとUpdateコールバックの違いを活用します。つまり
- 「コルーチンはコンポーネントのEnable/Disableに関係なく動作する」
- 「UpdateコールバックはEnableの時のみ動作する」
なので、コルーチンの開始時にコンポーネントをDisable、終了時にEnableするようなコードを記述すれば、Start完了後にUpdateが呼ばれ始めるようになります。
using UnityEngine;
using System.Collections;
using System;
public class LoadAB : MonoBehaviour
{
IEnumerator Start ()
{
Debug.Log ("start");
enabled = false;
yield return new WaitForSeconds (1);
enabled = true;
Debug.Log ("EndStart");
}
void Update()
{
Debug.Log ("Update");
}
}
それ以外のコルーチン化
UpdateはEnableで呼ばなくする事が出来ますが、他のコールバック…例えばOnTriggerEnterはDisableでも呼ばれます。なので、これもコルーチン化して遅延処理する場合は注意が必要です。
またAwakeやOnEnableなどのコルーチン化出来ないコールバックも幾つかあります。
そういった処も含めて、コールバックを直でコルーチン化するよりStartCoroutineを使った方が安定するかもしれません。
コールバックの中断
このStartをはじめとした幾つかのコールバックですが、GameObjectを非アクティブにすれば中断…というか終了する事が出来ます。
この方法で中断した場合は再開する事は出来ないので、中断する可能性がある場合はStartCoroutineを使う方が良いかもしれません。