【Unity】 StartCoroutine以外でコルーチンを回す方法

コルーチンを自分で回す方法。

コルーチンは実はStartCoroutineで呼び出す以外にも走らせる方法がある。

このお題もUnityというよりはC#なのだが、
大体UnityでコルーチンというとStartCoroutineで呼ぶものという感じで定着している気がするので
もっと原始的な方法を紹介したい。

方法は簡単で、

①IEnumerator型を戻り値に持つメソッドを書く(コルーチン部分)

②IEnumerator型の変数Aに①のメソッドを代入(?)する

③AのMoveNextメソッドを呼ぶ


だけでいい。

コードで書くと下記のようになる。

    // Start
void Start()
{
m_Enumerator = coOutputGaisenmon();
}
// Update
void Update()
{
if( m_Enumerator != null )
{
bool ret = m_Enumerator.MoveNext();
if( ret )
Debug.Log ("true.");
else{
Debug.Log("false.");
m_Enumerator = null;
}
}

}
// coroutine
private IEnumerator coOutputGaisenmon()
{
Debug.Log("Prix");
yield return null;

Debug.Log("de");
yield return null;

Debug.Log("l'Arc de Triomphe");
}

// member
public IEnumerator m_Enumerator;


MoveNextメソッドが呼ばれると、そのコルーチンのyield returnの記述がある場所まで
処理が走り、returnされるとtrueを返す。

その次のフレームではそのreturnされた箇所以降の処理がまたMoveNextメソッドによって走る... の繰り返し。

要はreturnされたらtrueを返し、(=まだ続く可能性がある)
returnが無く最後まで到達するとfalseを返す。


こうやって自前でコルーチンを管理出来ることで、StartCoroutineやStopCoroutineに縛られない
もっと柔軟な処理を書く事が出来る... と思う。

コルーチンの停止でも触れたが、MonoBehaviourのStartCoroutine等は微妙に罠があるので、
コルーチン処理内でエラーハンドリングを厳にしたい場合は、
今回紹介した方法の方が管理はしやすいと思う。

MoveNextメソッドを呼ばなければ停止扱いに出来るのが強みだろうか。
MoveNextを呼ぶ処理をラップしたメソッドを用意して、フラグなどを見て管理するのにも向いているだろう。


とりあえず自分はしばらくこの自前呼び出しでやってみようと思っている。
というかこれがC#本来のコルーチンでもあるから。

[ 2013年10月12日 11:07:28 : Unity ]

カレンダー

プルダウン 降順 昇順 年別

06月 | 2020年07月 | 08月
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -


全記事表示リンク

全ての記事を表示する

検索フォーム

リンク