This document is about: FUSION 1
SWITCH TO

수정중인 페이지 입니다.

메타버스 WebGL 빌드


Available in the Industries Circle
Circle

개요

메타버스 샘플은 WebGL 대상에 대해 빌드 할 수 있습니다.

그러나 WebGL 빌드와 관련된 일부 유니티의 제한으로 인해 몇 가지 사항이 제대로 작동하려면 구체적인 관리가 필요하며 아래에 자세히 나와 있습니다.

이 WebGL 빌드는 WebXR(브라우저의 가상 현실)을 지원하지 않습니다. unity-webxr-export와 같은 일부 오픈 소스 라이브러리에서 구현할 수 있지만 유니티에서는 아직 기본적으로 지원되지 않으므로 여기에서는 설명하지 않습니다.

Metaverse WebGL 빌드 여기를 테스트할 수 있습니다.

비동기화 코드: Task.Delay

WebGL 빌드에서는 일부 asnyc/wait 메소드가 의도한 대로 작동하지 않아 문제가 발생합니다. 주로 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 및 립 동기화

현재 유니티 버전에서는 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