unityでゲームを作っています。C#の非同期処理の書き方について質問させていただきます。
下の該当コードがコンパイルエラーとなることは分かるのですが、非同期処理内に非同期処理を重ねて書く方法を知りたいです。
該当のソースコード(間違った文法です。実現したい内容として書いた例です)
C#
1private async void Update() 2{ 3 await StartCoroutine(Activate()); 4} 5 6private IEnumerator Activate() 7{ 8 if(flag==0){ 9 await StartCoroutine(A()); 10 } 11 else if(flag==1){ 12 await StartCoroutine(B()); 13 } 14 else if(flag==2){ 15 await StartCoroutine(C()); 16 } 17 yield return null; 18} 19 20private IEnumerator A() 21{ 22 処理a1; 23 await StartCoroutine(D()); 24 処理a2; 25 yeild return null; 26} 27 28private IEnumerator D() 29{ 30 処理d1; 31 yeild return null; 32 処理d2; 33} 34・・・
実装したいのは、上のコードを例とすると、
(B()やC()を書いていませんが、A()と同じ様な構造だとみなしてください)
1.
flagが0のとき
「処理a1、処理d1、処理d2、処理a2」
flagが1のとき
「処理b1、処理d1、処理d2、処理b2」
・・・
という順番で処理を行う。
(すなわち、await StartCoroutine(D());で終了待ちする。
すなわち、「処理a1、処理d1、処理a2、処理d2」などの順番にならない。)
flagが0や1など動的に変化するが、
「処理a1、処理d1、処理d2、処理a2」や「処理b1、処理d1、処理d2、処理b2」をそれぞれ1セットとみなし、
「処理a1、処理d1、処理b1、処理d2、処理a2」というふうに途中に別コルーチンの処理を挟まない。
(すなわち、await StartCoroutine(A());で終了待ちする。B()、C()も同じ。
すなわち、flagの変化に応じて「処理a1、処理d1、処理d2、処理a2」、「処理b1、処理d1、処理d2、処理b2」、「処理c1、処理d1、処理d2、処理c2」・・・と処理をする。)
というような、awaitによる終了待ちをA()とD()の2段階で行うプログラムです。
awaitが非同期メソッド(A()やB()、C())の中で記述できないために不便を強いられています。
回りくどい書き方(変数フラグを建てて管理する)をすると実装自体はできるのですが、分かりづらいコードになってしまうため、非同期処理内に非同期処理を書く方法をお尋ねしたい所存です。
ご教授よろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/16 12:25