Q:コルーチンに渡すメソッドをIEnumeratorでないものにしたらどうなるのか?
A:実はSendMessageみたいな動きをします。
コルーチンを開始するにはStartCoroutineを使って行うのが一般的だと思います。3種類のオーバーロードがあります。メソッドをそのまま渡すIEnumeratorを引数に取るもの、メソッド名を引数に渡すもの、メソッド名とそのメソッドに渡すパラメータを引数にするものです。
- StartCoroutine(Func1());
- StartCoroutine(“Func2”);
- StartCoroutine(“Func3”, 3);
上のように使い方が異なります。今回の記事で取り上げるのは2番目と3番目のメソッド名を渡してやる場合です。
本来コルーチンはIEnumeratorを返すメソッドとして実装しなければなりません。StartCoroutineの第2、第3の形式では文字列の指定をするだけなので、IEnumeratorを返さないメソッドを指定することができてしまいます。
本来コルーチンはIEnumeratorを返すメソッドとして実装しなければなりません。StartCoroutineの第2、第3の形式では文字列の指定をするだけなので、IEnumeratorを返さないメソッドを指定することができてしまいます。
正しい使い方ではないのですが、実はちゃんと機能するみたいです。(公式の説明はないが検証してみると問題がなかったという意味です。)
引数に指定したメソッドの引数は0か1個でないと駄目ですが、引数に合わせた適切なパラメータを渡すようにしてやるとそのメソッドを単に呼び出すようになります。
内部的に同じかはわかりませんが、SendMessageという機能と何ら変わらない使い方になります。(SendMessageのOptionがない場合と同等でした。)
以下に検証したときのコードを載せておきます。この機能を使ってみようという人は、ソースをダウンロードするなり、コピーするなりして検証してみると良いと思います。
へぇーという感じですが、まさしくそれだけです。
コメント