Unity5.3から、コルーチン内でコルーチンを呼び出しやすくなった
先日、Unityの新機能で遊ぶ会というのに参加してきました。
そこで、気になっていたUnity5.3の新機能のカスタムコルーチンというのを試してました。
公式ブログではこんな感じhttp://blogs.unity3d.com/jp/2015/12/01/custom-coroutines/
まとめると…
・WaitForSecondsのようなnewするとコルーチンとして使えるクラスを自作できるようになった
・条件が満たされるまで待機する、WaitUntil が追加
・条件が満たさている間は待機する、WaitWhile が追加
という感じです。ファイルロードとかの非同期処理を管理するクラスを俄然作りやすくなりましたね。
さらに、一つ地味ながら非常に便利な機能が使えるようになっていたのでそれについて補足
それは、「コルーチン内でコルーチンを呼び出すときに、StartCorouitneが不要になった」という点です。
コルーチン内でコルーチンを呼ぶには、StartCoroutineが必須だったため、MonoBehaviourクラスを使う必要がありました。
昔その点をまとめたので、詳細はこちら
5.3からはこのように書けるようになりました。
[csharp]
public class SubClass
{
public IEnumerator CoTest()
{
yield return CoTest1();
yield return CoTest2();
}
// 5.3以前の書き方、MonoBehaviorが必要(呼び出しもとなど)
// public IEnumerator CoTest( MonoBehavior parent )
// {
// yield return parent.StartCorouitne( CoTest1() );
// yield return parent.StartCorouitne( CoTest2() );
// }
IEnumerator CoTest1()
{
yield return 0;
}
IEnumerator CoTest2()
{
yield return 0;
}
}
[/csharp]
ちょっとややこしいですが、あくまでコルーチン内部でコルーチンを呼び出すときのケースです。
最初のコルーチンの呼び出し、例でいうとCoTest()の呼び出しはやはりStartCoroutineが必要です。
「MonoBehaviour以外のクラスでも自由にコルーチンを入れ子として使える」 というのがポイントです。
これの何が便利かというと、コルーチンの内部が複雑になったときに処理を切り分けたり、再利用できるきることなんですよね。
昔はこの辺の処理の書き辛さのせいで、コルーチンの内部処理が一つのメソッド内でひたすら肥大化したり、似たような処理があちこちにできたりとか、そういうことも起きかねなかったので。
「そもそもMonoBehaviour以外のクラスでコルーチン実装しなければいい」という意見もありますが、GameObject単位でインスタンスが作りたくないときとか、通常のクラスでできたほうが便利なケースは多いのです。
5.3のカスタムコルーチンの応用範囲は相当広いので、色々作ってみたいですね。
2016年3月21日