問題
Unityで音声ファイルをダウンロードして再生する手順はこのようなコードになります。
ChatGPTが書いたサンプルコード
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class AudioClipDownloader : MonoBehaviour
{
public string audioUrl = "https://example.com/audiofile.mp3"; // 音声ファイルのURL
public AudioSource audioSource;
void Start()
{
if (audioSource == null)
{
audioSource = gameObject.AddComponent<AudioSource>();
}
StartCoroutine(DownloadAndPlayAudio());
}
IEnumerator DownloadAndPlayAudio()
{
using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(audioUrl, AudioType.MPEG))
{
yield return www.SendWebRequest();
if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError(www.error);
}
else
{
AudioClip clip = DownloadHandlerAudioClip.GetContent(www);
audioSource.clip = clip;
audioSource.Play();
}
}
}
}
UnityEditor上ではこれで正常に再生できます。
しかし、WebGLでビルドし、ブラウザで実行したところ、エラーは発生しないが再生されないという問題が発生しました。
AudioClipの中身を出力したところ、loadStateがUnloadedになっていました。
これはローディングされていない状態を指しています。
https://docs.unity3d.com/jp/2019.1/ScriptReference/AudioDataLoadState.Unloaded.html
これでは再生できません。
解決策
ローディングされるまで待つ必要がありました。
下記を追加してloadStateが変わるまで待ちます。
while(clip.loadState == AudioDataLoadState.Unloaded) {
yield return null;
}
ChatGPTが書いたサンプルコード(追記)
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class AudioClipDownloader : MonoBehaviour
{
public string audioUrl = "https://example.com/audiofile.mp3"; // 音声ファイルのURL
public AudioSource audioSource;
void Start()
{
if (audioSource == null)
{
audioSource = gameObject.AddComponent<AudioSource>();
}
StartCoroutine(DownloadAndPlayAudio());
}
IEnumerator DownloadAndPlayAudio()
{
using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(audioUrl, AudioType.MPEG))
{
yield return www.SendWebRequest();
if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError(www.error);
}
else
{
AudioClip clip = DownloadHandlerAudioClip.GetContent(www);
while(clip.loadState == AudioDataLoadState.Unloaded) {
yield return null;
}
audioSource.clip = clip;
audioSource.Play();
}
}
}
}
※ Unity2022.3.44f1を使用。