🎵

UnityWebRequest で AudioClip をストリーミング再生したいとき

2022/05/21に公開

音ゲーを作ってるのですが、プレイヤーが自由に楽曲を追加できる仕様のため、ローカルからでもサーバからでも音源を AudioClip として読み込む必要がありました。

しかしながら、読み込んだ AudioClip の再生方法(Load Type)を Streaming にする方法がいくら調べても分からなかったため苦労しました。

ダウンロード自体は非同期でできるのですが、ストリーミング再生にしないとどうしてもデータを AudioClip に変換するときに固まってしまいますので。

上記の画像のように設定したいですが、動的に読み込んでいるため当然ソースからいじるしかありません。

※Unity 2020.3.21f1

結論

UnityWebRequest.downloadHandlerDownloadHandlerAudioClip にキャストして、streamAudiotrue にする。

これが書いてあるところが、ほとんどなくてつまづきました。

気づけばどうということはないのですが……。

using System.IO;
using UnityEngine.Networking;
using Cysharp.Threading.Tasks;

public static class AudioLoader
{
  public static async UniTask<AudioClip> DownloadAudioClip(string uri, bool streaming)
  {
      var request = UnityWebRequestMultimedia.GetAudioClip(uri, GetAudioType(uri));
      
      // これが必要
      ((DownloadHandlerAudioClip)request.downloadHandler).streamAudio = streaming;

      await request.SendWebRequest();

      if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
      {
          Debug.LogError(request.error);
          return null;
      }

      return DownloadHandlerAudioClip.GetContent(request);
  }
	
  public static AudioType GetAudioType(string uri)
  {
      switch (Path.GetExtension(uri).ToLower())
      {
          case ".ogg":
              return AudioType.OGGVORBIS;
          case ".mp3":
              return AudioType.MPEG;
          default:
              return AudioType.UNKNOWN;
      }
  }
}

Discussion