【Unity】コルーチン終了時にコールバックで結果を受け取る方法

コールーチン終了時に、コールバックで結果を受け取る方法のメモです。

コルーチンの呼び元が別クラスの場合とか、コルーチンの終了をどうやって呼び元に通知しよう?
って、悩んだことないですか?

私は、今日、この悩みに遭遇しました。

というわけで、まずは簡単なサンプル作ってみました。

<仕様>
・[発射開始]ボタンを押したら、黒い箱から赤い玉を0.5秒間隔で発射。
・発射される玉の数は、1〜10のランダム値。
・発射が終了したら、発射された玉数を画面に表示。

unity_coroutine_callback_sample.png

ソースはこの2本。
・UIManager.cs(UIまわりを制御)
・Box.cs(赤い玉を発射する黒い箱)

・UIManager.cs
[発射開始]ボタンが押されたら、箱(Box.cs)の玉発射コルーチンを開始。
この時、コールバックとして、OnFinishedCoroutineを指定。
OnFinishedCoroutine()では、結果「発射された玉数」を画面に表示。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class UIManager: MonoBehaviour {
public Text resultText;
public Box box;

//[発射開始]ボタンクリック時
public void OnClickStartCoroutine(){
resultText.text = "";
// コルーチン開始
StartCoroutine(box.ShotBalls(OnFinishedCoroutine));
}

// コルーチン終了時
public void OnFinishedCoroutine(int num){
resultText.text = num + "個のボールが発射されました。";
}
}

・Box.cs
玉発射コルーチンでは、0.5秒間隔で赤い玉(1〜10個)を発射。
終了時に、発射した玉数と共にコールバック。

using UnityEngine;
using UnityEngine.Events;
using System.Collections;

public class Box : MonoBehaviour {
public GameObject prefab;
public float velocity = 5f;

// 赤い玉を発射するコルーチン
public IEnumerator ShotBalls( UnityAction< int > callback ){
// 発射する玉数をセット(1〜10のランダム値)
int shotNum = Random.Range(1,10);

int i = 0;
while (i < shotNum){
// 玉オブジェクト生成
GameObject ball = Instantiate(prefab, transform.position+Vector3.up, Quaternion.identity) as GameObject;

// 発射方向
Vector3 direction = new Vector3(Random.Range(-1f,1f), Random.Range(0.5f,1f), Random.Range(-1f,1f));

// 玉発射!
ball.GetComponent< Rigidbody >().velocity = direction * velocity;

// 0.5秒待機
yield return new WaitForSeconds (0.5f);

i++;
}
// コールバック
callback(shotNum);
}
}

ポイントは、UnityActionですね!



この記事へのコメント