🎵
UnityWebRequest で AudioClip をストリーミング再生したいとき
音ゲーを作ってるのですが、プレイヤーが自由に楽曲を追加できる仕様のため、ローカルからでもサーバからでも音源を AudioClip として読み込む必要がありました。
しかしながら、読み込んだ AudioClip の再生方法(Load Type)を Streaming にする方法がいくら調べても分からなかったため苦労しました。
ダウンロード自体は非同期でできるのですが、ストリーミング再生にしないとどうしてもデータを AudioClip に変換するときに固まってしまいますので。

上記の画像のように設定したいですが、動的に読み込んでいるため当然ソースからいじるしかありません。
※Unity 2020.3.21f1
結論
UnityWebRequest.downloadHandler を DownloadHandlerAudioClip にキャストして、streamAudio を true にする。
これが書いてあるところが、ほとんどなくてつまづきました。
気づけばどうということはないのですが……。
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