回答編集履歴

2

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

2018/02/15 03:07

投稿

fiveHundred
fiveHundred

スコア9827

test CHANGED
@@ -150,12 +150,18 @@
150
150
 
151
151
  }
152
152
 
153
+
154
+
155
+ source.Play();
156
+
157
+
158
+
159
+ // ロード完了まで待機
160
+
161
+ yield return www;
162
+
153
163
  }
154
164
 
155
-
156
-
157
- source.Play();
158
-
159
165
  }
160
166
 
161
167
  }

1

追記

2018/02/15 03:07

投稿

fiveHundred
fiveHundred

スコア9827

test CHANGED
@@ -43,3 +43,157 @@
43
43
  ・OnGUI()は古いものだそうです。
44
44
 
45
45
  できれば、新しいGUI(uGUIと呼ばれることがある)を使う方がよろしいかと思います。
46
+
47
+
48
+
49
+ ---
50
+
51
+
52
+
53
+ 追記:
54
+
55
+ ``www.GetAudioClip()``の第2引数がtrueとなっておりますが、もしかしてストリーミング再生を行いたいということでしょうか?
56
+
57
+ もし、そうなのであれば、``yield return www;``はロード完了するまで待機するという意味なので、違うのではないかなと思います。
58
+
59
+
60
+
61
+ そのため、スクリプトを作り直してみました。
62
+
63
+ 同じファイルを2回ロードしようとするとエラーが出たので、そうならないように変更を加えたコードになります。
64
+
65
+
66
+
67
+ ```C#
68
+
69
+ using System.Collections;
70
+
71
+ using System.Collections.Generic;
72
+
73
+ using UnityEngine;
74
+
75
+
76
+
77
+ public class AudioRead : MonoBehaviour
78
+
79
+ {
80
+
81
+ AudioSource source;
82
+
83
+
84
+
85
+ void Start()
86
+
87
+ {
88
+
89
+ // AudioSourceは1度だけ生成するようにする
90
+
91
+ source = gameObject.AddComponent<AudioSource>();
92
+
93
+ source.playOnAwake = false;
94
+
95
+ }
96
+
97
+
98
+
99
+ public void ReadAudio()
100
+
101
+ {
102
+
103
+ if (source.clip == null || source.clip.loadState == AudioDataLoadState.Failed)
104
+
105
+ {
106
+
107
+ // コルーチンを開始
108
+
109
+ StartCoroutine(LoadAudioCoroutine());
110
+
111
+ }
112
+
113
+ else if (source.clip.loadState != AudioDataLoadState.Unloaded)
114
+
115
+ {
116
+
117
+ // ロード開始後のみ再生
118
+
119
+ source.Stop();
120
+
121
+ source.Play();
122
+
123
+ }
124
+
125
+ }
126
+
127
+
128
+
129
+ IEnumerator LoadAudioCoroutine()
130
+
131
+ {
132
+
133
+ // パスは適宜変更してください
134
+
135
+ using (WWW www = new WWW("file://" + Application.streamingAssetsPath + "/myvoice.wav"))
136
+
137
+ {
138
+
139
+ source.clip = www.GetAudioClip(false, true);
140
+
141
+
142
+
143
+ // ロード開始まで待機
144
+
145
+ while (source.clip.loadState == AudioDataLoadState.Unloaded)
146
+
147
+ {
148
+
149
+ yield return null;
150
+
151
+ }
152
+
153
+ }
154
+
155
+
156
+
157
+ source.Play();
158
+
159
+ }
160
+
161
+ }
162
+
163
+ ```
164
+
165
+
166
+
167
+ ```C#
168
+
169
+ using System.Collections;
170
+
171
+ using System.Collections.Generic;
172
+
173
+ using UnityEngine;
174
+
175
+
176
+
177
+ public class Start_analyze_action : MonoBehaviour
178
+
179
+ {
180
+
181
+ // Inspector上からAudioReadをアタッチしたオブジェクトを指定
182
+
183
+ public AudioRead audioreads;
184
+
185
+
186
+
187
+ // uGUIのボタンを作成し、そのボタンのOn Click()に登録する
188
+
189
+ public void OnClickButton()
190
+
191
+ {
192
+
193
+ audioreads.ReadAudio();
194
+
195
+ }
196
+
197
+ }
198
+
199
+ ```