質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

836閲覧

受け取る引数の異なる同じコルーチンにて複数使用した場合、遅延されず同時に実行されてしまう

MujinSekai

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/08/07 20:35

受け取る引数の内容が異なる同じコルーチンを遅延させたいと思っています。しかし複数使用した場合、遅延されると思うのですが、同時に実行されてしまいます(遅延も同時に発生します)。どのようにすれば、遅延させる(順番に実行する)ことができるでしょうか?

該当のソースコード

C#

1void MethodA() 2{ 3 StartCoroutine("CoroutineB", aGameObject); 4 StartCoroutine("CoroutineB", bGameObject); 5 StartCoroutine("CoroutineB", cGameObject); 6} 7 8IEnumerator CoroutineB(GameObject obj) 9{ 10 // objを用いた処理 11 12 yield return new WaitForSeconds(1.0f); 13}

ご覧になって下さった方、ありがとうございます

補足情報(FW/ツールのバージョンなど)

Unity 2018.2.2f1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

StartCoroutineが返すCoroutineYieldInstructionの一種ですので、yield return ...で「コルーチンの完了を待って再開」することも可能です。

そこで、3つのCoroutineBをスタートさせる部分もコルーチンにしてしまって、順次CoroutineB完了を待機させるようにしてみてはどうでしょうか?

C#

1void MethodA() 2{ 3 StartCoroutine("CoroutineA"); 4} 5 6IEnumerator CoroutineA() 7{ 8 yield return StartCoroutine("CoroutineB", aGameObject); 9 yield return StartCoroutine("CoroutineB", bGameObject); 10 yield return StartCoroutine("CoroutineB", cGameObject); 11} 12 13IEnumerator CoroutineB(GameObject obj) 14{ 15 // objを用いた処理 16 17 yield return new WaitForSeconds(1.0f); 18}

投稿2018/08/07 21:06

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MujinSekai

2018/08/07 21:53 編集

丁寧な回答ありがとうございます。 CoroutineBはボールが飛んでいくような挙動で、着地と同時に次のボールを投げる、を連続で行う処理でした。着地まで数秒の間があり、その間に次のボールの処理が終わってしまうので何秒か遅延させたいと思っております。
Bongo

2018/08/07 22:05

CoroutineB内で「objを用いた処理」を行った後、「 yield return new WaitForSeconds(1.0f);」の待機時間をもっと長くすればいいのではないかと思ったのですが、そうではないのでしょうか? もし「ボール(aGameObject)が着地するのを確実に待ってから、次のボール(bGameObject)を発射したい」といったご要望でしたら、実際のコードを見てみる必要がありそうです。 CustomYieldInstruction(https://docs.unity3d.com/ja/current/ScriptReference/CustomYieldInstruction.html )を使えば、多少複雑な条件でもコルーチンの再開タイミングを制御できるだろうとは思うのですが...
MujinSekai

2018/08/07 22:14

回答ありがとうございます。コルーチンの問題だと思っていたのですが、 // objを用いた処理、の前にInstantiate()でオブジェクトを一気に生成していたのが上手く行かなかった原因でした。ボール(実際はカード)が一度に生じていたので何らかの理由でコルーチンの遅延が効かなかったのだと勘違いしておりました。申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問