teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

ロード完了まで待機するように変更

2018/02/15 03:07

投稿

fiveHundred
fiveHundred

スコア10454

answer CHANGED
@@ -74,9 +74,12 @@
74
74
  {
75
75
  yield return null;
76
76
  }
77
+
78
+ source.Play();
79
+
80
+ // ロード完了まで待機
81
+ yield return www;
77
82
  }
78
-
79
- source.Play();
80
83
  }
81
84
  }
82
85
  ```

1

追記

2018/02/15 03:07

投稿

fiveHundred
fiveHundred

スコア10454

answer CHANGED
@@ -20,4 +20,81 @@
20
20
  このままだとaudioreadsはnullのままなので、``audioreads.ReadAudio();``でエラーが発生してしまいます。
21
21
 
22
22
  ・OnGUI()は古いものだそうです。
23
- できれば、新しいGUI(uGUIと呼ばれることがある)を使う方がよろしいかと思います。
23
+ できれば、新しいGUI(uGUIと呼ばれることがある)を使う方がよろしいかと思います。
24
+
25
+ ---
26
+
27
+ 追記:
28
+ ``www.GetAudioClip()``の第2引数がtrueとなっておりますが、もしかしてストリーミング再生を行いたいということでしょうか?
29
+ もし、そうなのであれば、``yield return www;``はロード完了するまで待機するという意味なので、違うのではないかなと思います。
30
+
31
+ そのため、スクリプトを作り直してみました。
32
+ 同じファイルを2回ロードしようとするとエラーが出たので、そうならないように変更を加えたコードになります。
33
+
34
+ ```C#
35
+ using System.Collections;
36
+ using System.Collections.Generic;
37
+ using UnityEngine;
38
+
39
+ public class AudioRead : MonoBehaviour
40
+ {
41
+ AudioSource source;
42
+
43
+ void Start()
44
+ {
45
+ // AudioSourceは1度だけ生成するようにする
46
+ source = gameObject.AddComponent<AudioSource>();
47
+ source.playOnAwake = false;
48
+ }
49
+
50
+ public void ReadAudio()
51
+ {
52
+ if (source.clip == null || source.clip.loadState == AudioDataLoadState.Failed)
53
+ {
54
+ // コルーチンを開始
55
+ StartCoroutine(LoadAudioCoroutine());
56
+ }
57
+ else if (source.clip.loadState != AudioDataLoadState.Unloaded)
58
+ {
59
+ // ロード開始後のみ再生
60
+ source.Stop();
61
+ source.Play();
62
+ }
63
+ }
64
+
65
+ IEnumerator LoadAudioCoroutine()
66
+ {
67
+ // パスは適宜変更してください
68
+ using (WWW www = new WWW("file://" + Application.streamingAssetsPath + "/myvoice.wav"))
69
+ {
70
+ source.clip = www.GetAudioClip(false, true);
71
+
72
+ // ロード開始まで待機
73
+ while (source.clip.loadState == AudioDataLoadState.Unloaded)
74
+ {
75
+ yield return null;
76
+ }
77
+ }
78
+
79
+ source.Play();
80
+ }
81
+ }
82
+ ```
83
+
84
+ ```C#
85
+ using System.Collections;
86
+ using System.Collections.Generic;
87
+ using UnityEngine;
88
+
89
+ public class Start_analyze_action : MonoBehaviour
90
+ {
91
+ // Inspector上からAudioReadをアタッチしたオブジェクトを指定
92
+ public AudioRead audioreads;
93
+
94
+ // uGUIのボタンを作成し、そのボタンのOn Click()に登録する
95
+ public void OnClickButton()
96
+ {
97
+ audioreads.ReadAudio();
98
+ }
99
+ }
100
+ ```