テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Startのコルーチン完了後にUpdate処理を開始したい

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");
	}
}

f:id:tsubaki_t1:20151115011956j:plain

それ以外のコルーチン化

UpdateはEnableで呼ばなくする事が出来ますが、他のコールバック…例えばOnTriggerEnterはDisableでも呼ばれます。なので、これもコルーチン化して遅延処理する場合は注意が必要です。

またAwakeやOnEnableなどのコルーチン化出来ないコールバックも幾つかあります。

そういった処も含めて、コールバックを直でコルーチン化するよりStartCoroutineを使った方が安定するかもしれません。

コールバックの中断

このStartをはじめとした幾つかのコールバックですが、GameObjectを非アクティブにすれば中断…というか終了する事が出来ます。

この方法で中断した場合は再開する事は出来ないので、中断する可能性がある場合はStartCoroutineを使う方が良いかもしれません。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp