Metaverse WebGLビルド
概要
Metaverseサンプルは、WebGLターゲットでビルドできます。
ただWebGLビルドに関するUnityの制限により、正しく動作させるために何点か固有の対応が必要で、その詳細を以下に示します。
このWebGLビルドは、WebXR(ブラウザ上のVR)に対応していません。unity-webxr-exportなどのオープンソースライブラリを使用することで対応可能ですが、デフォルトのUnityでは未対応のため、ここではそれを示しません。
Metaverse WebGLビルド(Fusion 1)はこちらからテストできます。
非同期コード:Task.Delay
WebGLビルドでは、async/awaitメソッドは思い通りには動作せず、問題に繋がります。
主に、System.Threading.Tasks.Task.Delay
メソッドはWebGLビルドでは動作しません。
この制限を回避するため、MetaverseサンプルではWebGLと互換性があるAsyncTask.Task
メソッドを提供しています。
これはTask.Yield
に依存していて、WebGLビルドと互換性があります。
C#
public static class AsyncTask
{
public static async Task Delay(int milliseconds)
{
#if !UNITY_WebGL
await Task.Delay(milliseconds);
#else
// Unity 2021 do NOT support Task.Delay() in WebGL
float startTime = Time.realtimeSinceStartup;
float delay = (float)milliseconds / 1000f;
while (Time.realtimeSinceStartup - startTime < delay)
{
// Wait for the delay time to pass
await Task.Yield();
}
#endif
}
}
AudioSourceとリップシンク
現在のバージョンのUnityのWebGLビルドでは、AudioSource
コンポーネントは、兄弟コンポーネントのOnAudioFilterRead
コールバックをトリガーしません。
したがって、そのコールバックのデータを使用して声の音量を計算するVoiceDetection
コンポーネントは正しく動作しません。
WebGLではかわりに、VoiceDetection
は生のオーディオデータにアクセスするためにPhotonVoiceのコールバックを使用します。
ユーザーのネットワークプレハブでは、ヘッドセットがSpeaker
コンポーネントを持ち、PhotonVoiceの部分にRemoveVoice
フィールドがあります。
ここで、FloatFrameDecoded
を購読することが可能で、オーディオデータを受信した時に通知されます。
Speaker
が初期化される(IsLinked
がtrue
を返す)と、OnFloatFrameDecoded
コールバックが追加されます。
C#
if (speaker == null) speaker = audioSource.GetComponent<Speaker>();
if(HasSubscribedToVoice == false && speaker != null && speaker.IsLinked)
{
speaker.RemoteVoice.FloatFrameDecoded += OnFloatFrameDecoded;
HasSubscribedToVoice = true;
}
そこから、コールバックはすべての受信したオーディオデータを提供し、音声レベルの平均を計算して、それに応じてリップシンクを表示します。
C#
private void OnFloatFrameDecoded(FrameOut<float> frame)
{
float writeVoiceVolume = 0f;
foreach (var sample in frame.Buf)
{
writeVoiceVolume += Mathf.Abs(sample);
}
writeVoiceVolume /= frame.Buf.Length;
// audioWriteCalls and accumulatedVolume are reset during Update
audioWriteCalls++;
accumulatedVolume += writeVoiceVolume;
voiceVolume = accumulatedVolume / audioWriteCalls;
}
この適応は、シンプルなアバターモデルとReadyPlayerMeアバターで使用されることに注意してください。
ReadyPlayerMeアバターに関して、デスクトップとQuestビルドでは、これらはOculus Lipsyncに依存し、その基礎となるライブラリはWebGLビルドでは使用できません。
そのため、ここではシンプルなバージョンが使用されていて、PhotonVoiceのコールバックを使用するためにReadyPlayerMeから提供されるデフォルトのRPMLipSync
コードを適応しています。
TextMeshProマテリアル
とある状況で、全く同じフォントマテリアルを使用しているTextMeshPro
とTextMeshProUGUI
コンポーネントがシーンに含まれていると、TextMeshProのテキストが表示されません。
この問題を修正するには、フォントに関連付けられたマテリアルを複製する必要があります。
それから、シーン上のTextMeshPro
とTextMeshProUGUI
コンポーネントが同じMaterial Preset
を使用していないことを確認してください。