This document is about: FUSION 2
SWITCH TO

Metaverse WebGLビルド


Available in the Industries Circle
Circle

概要

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が初期化される(IsLinkedtrueを返す)と、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マテリアル

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

Back to top