1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UnityのWebGLでダウンロードしたAudioClipがUnloadedで再生できない問題

Posted at

問題

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を使用。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?