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

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

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

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

Unity

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

Q&A

解決済

2回答

5067閲覧

UnityWebRequestのロードが終わらない

orina

総合スコア16

C#

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

Unity

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

0グッド

0クリップ

投稿2019/05/09 18:21

http://fantom1x.blog130.fc2.com/blog-entry-299.html?sp
こちらに掲載されているコードを使って前回の質問で取得したパスを引数にして音声ファイルを読み込もうとしたのですが、音声が再生されません。

様々な場所にDebug.Logを入れて確認してみたところ、以下の場所で無限ループが発生していました。

C#

1 using (UnityWebRequest req = new UnityWebRequest("file://" + path)) //※あくまでローカルファイルとする 2 { 3 while (!req.isDone) 4 { 5 Debug.Log("wait...");//ここが無限ループ 6 yield return null; 7 }

パスを引数にして再生するまでのコード

C#

1 //外部からの呼び出し用メソッド 2 public void LoadAudio(string path) 3 { 4 if (Path.GetExtension(path) == ".m4a") //※"m4a"は再生できないっぽい 5 { 6 Debug.Log("Not supported audio format."); 7 return; 8 } 9 10 StartCoroutine(LoadToAudioClipAndPlay(path)); 11 } 12 13 //ファイルの読み込み(ダウンロード)と再生 14 IEnumerator LoadToAudioClipAndPlay(string path) 15 { 16 Debug.Log($"load{path}"); 17 if (audioSource == null || string.IsNullOrEmpty(path)) 18 yield break; 19 20 if (!File.Exists(path)) 21 { 22 //ここにファイルが見つからない処理 23 Debug.Log("File not found."); 24 yield break; 25 } 26 Debug.Log("loading"); 27 using (UnityWebRequest req = new UnityWebRequest("file://" + path)) //※あくまでローカルファイルとする 28 { 29 while (!req.isDone) 30 { 31 Debug.Log("wait..."); 32 yield return null; 33 } 34 35 AudioClip audioClip = ((DownloadHandlerAudioClip)req.downloadHandler).audioClip; 36 if (audioClip.loadState != AudioDataLoadState.Loaded) 37 { 38 //ここにロード失敗処理 39 Debug.Log("Failed to load AudioClip."); 40 yield break; 41 } 42 43 //ここにロード成功処理 44 audioSource.clip = audioClip; 45 audioSource.Play(); 46 Debug.Log("Load success : " + path); 47 } 48 } 49

やってみたこと

new UnityWebRequestの時にパスを直接打ち込んだものを引数にしましたが結果は同じでした。

環境

Unity:2018.3.8f1
Windows10

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

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

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

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

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

k.matsuda

2019/05/10 01:11

私も初心者なのでよくわかりませんが、 yield return null; これって必要なんでしょうか?
fiveHundred

2019/05/10 01:33 編集

k.matsudaさん 必要です(私の回答のように書き換えない場合)。 もし入れなかった場合、通信が終わるまでフリーズしてしまいます。 コルーチンはあくまでマルチスレッド風に処理を書けるだけで、「yield return」かコルーチンそのものが終了するまで、他の処理を行えません(=フリーズします)。 ちなみに、「yield return null;」と書いた場合、待機するのは1フレーム分となります。
k.matsuda

2019/05/10 01:46

確かに、ループ中はフリーズしますね。 良い事を聞きました。 ありがとうございます
guest

回答2

0

ベストアンサー

req.SendWebRequest();を実行していないから開始していないために終了もしないという事だったりしませんか?

投稿2019/05/10 01:07

HiroshiWatanabe

総合スコア2160

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

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

orina

2019/05/10 08:51

まさにその通りでした。無事にファイルを読み込むことができました。
guest

0

※HiroshiWatanabeさんの回答に対する補足です。解決した場合はHiroshiWatanabeさんをベストアンサーにしてください。

req.SendWebRequest();を使う場合、以下のようにwhile文を使わずに書くことも出来ます。
この場合、req.SendWebRequest();が完了するまで待機することになります。

C#

1 using (UnityWebRequest req = new UnityWebRequest("file://" + path)) //※あくまでローカルファイルとする 2 { 3 yield return req.SendWebRequest(); 4 }

投稿2019/05/10 01:32

fiveHundred

総合スコア9805

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問