UnityでStartCoroutineメソッドやCoroutine型、使っていますか?
コルーチンを使うことで、時間を扱うコードが非常に書きやすくそして読みやすくなります。
またコルーチンの内部で別のコルーチンを発生させることができるので、条件分岐したり繰り返したりする複雑なコルーチンも記述可能です。
そんなコルーチンのよくある使い方はこんな感じでしょう。
using System.Collections;
using UnityEngine;
public class ResultView : MonoBehaviour
{
/* 中略 */
public Coroutine Show(Result result)
{
StartCoroutine(ShowEnumerator(result));
}
IEnumerator ShowEnumerator(Result result)
{
/*
ここでreusltのデータをビューに表示
*/
FadeIn();
yield return new WaitForSeconds(3.0F);
FadeOut();
}
/* 中略 */
}
ResultView
は、Result
を引数にとるShow
メソッドを持っています。Show
メソッドは、フェードインし、Result
のデータを3秒間表示し、フェードアウトします。このメソッドのポイントは次の行です。
yield return new WaitForSeconds(3.0F);
こうすることで、フェードインが行われてから3秒後にフェードアウトが実行されます。
さて、「3秒後」という処理を「閉じるボタンが押されたら」に変更するにはどうすればいいでしょうか?
Unityの標準UI、uGUIはボタンのクリックに対してデリゲート(詳しくはこちら)を登録し、「ボタンが押されたときに何をするか記述する」ことは非常に簡単にできます。しかし、このようにコルーチンと組み合わせるには工夫が必要です。
UniRxを用いれば、ボタンが押されたイベントとCoroutineを組み合わせることが可能です。
次のコードのように、UniRxのOnClickAsObservable
拡張メソッドと、First
メソッド、そしてToYieldInstruction
を用います。
IEnumerator ShowEnumerator(Result result)
{
/*
ここでreusltのデータをビューに表示
*/
FadeIn();
yield return closeButton
.OnClickAsObservable()
.First()
.ToYieldInstruction();
FadeOut();
}
ポイントはToYieldInstruction
メソッドです。これを用いることで、IObserable<T>
をコールーチン内で活用できます。
「ボタンが押された」よりももっと複雑なイベント・ストリームにも、ToYieldInstruction
メソッドそしてコルーチンは活躍しそうですね。