Metaverse WebGL ビルド
概要
MetaverseサンプルはWebGLターゲットにもビルドすることができます。
WebGLに関してはUnity側に制限があることにより、正確に動かすために特別な注意が必要な点があります。以下で詳細を説明しています。
このWebGLビルドはWebXL(ブラウザでの仮想現実)には対応しておりません。WebXLはオープンソースのライブラリ(unity-webxr-exportなど)でカバーできることから、Unityではデフォルトでは対応していません。よって、このページでも説明を行っていません。
非同期コード: Task.Delay
WebGLビルドでは非同期メソッド・待機メソッドのなかに意図通り動かないものがあり、結果として問題につながります。
主にSystem.Threading.Tasks.Task.Delay
がWebGLでうまく作動しない傾向があります。
この制限をバイパスするために、メタバースサンプルではWebGLで互換性のあるAsyncTask.Task
メソッドを提供しています。
これはWebGLビルドに互換性のあるTask.Yield
に依存しています。
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コールバックを使用して音声の生データへアクセスします。
ユーザーネットワークプレハブでは、ヘッドセットにPhotonVoiceの一部であるSpeaker
コンポーネントがあり、 RemoveVoice
があります。
ここでFloatFrameDecoded
へサブスクライブして音声データがいつ受信されるかを警告することができます。
スピーカーが初期化されたら(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ビルドでは使用することができません。
そのため、ここでは簡単なバージョンが使用されています。ReadyPlayerMeより提供されるデフォルトのRPMLipSync
コードはPhotonVoiceコールバックを使用するために適用化されています。
TextMeshPro マテリアル
シーンに全く同じフォントマテリアルを使用したTextMeshPro
とTextMeshProUGUI
の両方が含まれている場合、TextMeshProテキストが表示されないことがあります。
この問題を修正するには、フォントに関連するマテリアルを複製する必要があります。それから、シーン内のTextMeshPro
コンポーネントとTextMeshProUGUI
コンポーネントが同じMaterial Preset
を使用していないことを確認してください。