3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Unity C# コルーチンの覚え書き

Posted at

##コルーチンでクリック待ちできない?
Unity独習2週間くらい。
クリックorキー入力を待ってnGUIのテキストを変更したかったが、Updateメソッドで条件分けするのが面倒くさかった。
調べてみるとコルーチン(Coroutine)が使えそうとのことだったので試してみたがハマってしまった。

sample.cs
void Hoge(){ //コルーチンを呼び出す側メソッド
    foo(); //任意の処理
    StartCoroutine("Fuga") //コルーチン呼び出し
    bar(); //任意の処理
}
IEnumerator Fuga(){ //コルーチン
    //マウス左クリックを待つ処理
    yield return new WaitUntil(() =>
    Input.GetMouseButtonDown(0))
}

上記コードを実行すると、foo()を実行後にコルーチンFuga()が呼び出されクリック待ち状態に移行。クリックすることでbar()が実行されるはず……と思っていた。
が、結果は違っていた。foo()の直後にクリック待ち状態に移行することなくbar()が実行されてしまう。どうにかfoo()とbar()の間にクリック待ちを仕込みたかったが、ハマってしまったというわけ。

##解決
どうやらプログラムがforkする(詳しくはないので正しい言葉かは分からない)ようで、処理と処理の間にクリック待ちを挟みたい場合は、すべてをコルーチンの中に記述するほかないらしい。

sample02.cs
void Hoge(){ //コルーチンを呼び出す側メソッド
    StartCoroutine("Fuga") //コルーチン呼び出し
}
IEnumerator Fuga(){ //コルーチン
    foo(); //任意の処理
    //マウス左クリックを待つ処理
    yield return new WaitUntil(() =>
    Input.GetMouseButtonDown(0))
    bar(); //任意の処理
}

nGUIテキストをクリックするたびに変更する(たとえばADVのテキスト送りなど)場合、表示処理すべてをコルーチン内部に書くということなんかしら。
あんまりスマートな書き方ではない気がするね。ただ一応、ハマりからは脱出できたからよしとします。ヨシ!

3
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?