This document is about: FUSION 1
SWITCH TO

このページは編集中です。更新が保留になっている可能性があります。

Metaverse WebGL ビルド


Available in the Industries Circle
Circle

概要

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 マテリアル

シーンに全く同じフォントマテリアルを使用したTextMeshProTextMeshProUGUIの両方が含まれている場合、TextMeshProテキストが表示されないことがあります。
この問題を修正するには、フォントに関連するマテリアルを複製する必要があります。それから、シーン内のTextMeshProコンポーネントとTextMeshProUGUIコンポーネントが同じMaterial Presetを使用していないことを確認してください。

Back to top