🎵
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