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

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

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

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

Unity

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

Q&A

解決済

1回答

2418閲覧

コルーチンを使って「効果音が鳴り終わってからプログラムを実行」することができない

Minobato.com

総合スコア7

C#

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

Unity

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

0グッド

0クリップ

投稿2019/10/08 05:39

Unityで、「効果音が鳴り終わったら、次の処理へ入る」、という仕様でプログラムを作っていました。
そのためにコルーチンを使っていましたが、ネットで上がっていた方法をいくら調べたり実践しても全く仕様通りにならない上、コルーチン内のプログラムとコルーチンが終わった後のプログラムが同時に作動するということが起きました。

実際のプログラムをここに載せます。
コルーチンの形がいけなかったのか、それとも別の問題があったのか、原因を教えてください。お願いします。

//待機用コルーチン
private IEnumerator WaitCommand()
{

audioSource.PlayOneShot(sound5); while (true) {

       
yield return new WaitForFixedUpdate();

if (!audioSource.isPlaying) { Debug.Log("コルーチン終了"); break; } } }

  //Playボタンが押された時、待機用コルーチンが終わった後、sound0を再生する
public void AudioPlayButtonDown()
{

StartCoroutine(WaitCommand()); audioSource.PlayOneShot(sound0); }

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

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

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

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

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

guest

回答1

0

ベストアンサー

StartCoroutineはコルーチンを開始させるだけで、その終了を待ちません。
通常のコードと同様、直後に次の行が実行されていくので、audioSource.PlayOneShot(sound0);とコルーチンが並列実行される形となります。

終了待ちしたいなら、
WaitCommandのwhileの後にaudioSource.PlayOneShot(sound0);を入れるか、
AudioPlayButtonDownメソッドもIEnumeratorにしてyield return WaitCommand();とするといいです。
(なお、後者の場合はボタンから直接呼び出せないので別メソッドからStartCoroutine(AudioPlayButtonDown());が必要です。前者でいいと思いますがyieldはこういう風にも使えるよという一例として挙げておきます)

投稿2019/10/08 05:57

sakura_hana

総合スコア11427

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

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

Minobato.com

2019/10/08 06:20

分かりやすい説明をありがとうございます!  道理で2つのプログラムが同時に作動したわけです…。 プログラムは前者の設計で作ろうと思います。 少し話が長くなりますが、自分はある時から、処理が重かれ軽かれ(できれば軽く)「ちょっといじれば他のプロジェクトやゲームでも使いまわしができるプログラム」を作りたくて、ネットでも調べながら手探りでプログラムを作っています。 夢みたいな話ですがこの待機プログラムも同様、本命のプログラムと混ぜずにコルーチン1つで済ませて、ちょっといじれば後はどこでも使いまわしができるような形にしたかったのですが、「技術的に不可能(難しい)」でしょうか…?
sakura_hana

2019/10/08 07:32

要件と設計次第だと思います。 (この説明だと具体的に何がしたいのかよく分かりませんでした) 使い回しとはどの程度なのかも分からないので「まぁ大抵のことは出来るのでは?」とだけ言っておきます。 ちなみにコルーチン以外にもUpdateでチェックするとかデリゲートとかUniRxとか、手法や考え方は色々あるので汎用的な物を作りたいなら色々調べてみるといいと思います(自分で作らずとも既に存在しているかもしれません)。
Minobato.com

2019/10/08 07:42

方法は1つだけじゃないってことですね…。分かりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問