유니티 WebGL 안드로이드 백그라운드 진입 시 오디오 OFF 3초 지연

혹시 저와 같은 문제를 겪으시는 분들을 위해 댓글 남깁니다.

저는 초기에 오디오 Pause를 AudioListener.volume = 0; 이렇게 처리했었는데, 안드로이드에서 3초 정도 지연이 발생했었습니다.

아래의 코드대로 처리하면 안드로이드에서 홈버튼 등을 눌러서 백그라운드로 진입했을 때 오디오가 지연없이 중지됩니다.

// jslib 파일
mergeInto(LibraryManager.library, {
AIT_StartObserveVisibility: function (goPtr, methodPtr) {
var goName = UTF8ToString(goPtr);
var method = UTF8ToString(methodPtr);

// 이전 구독 해제
if (typeof window.__tossVisUnsub === 'function') {
  try { window.__tossVisUnsub(); } catch (e) {}
  window.__tossVisUnsub = null;
}

function send(state, evt) {
  var payload = JSON.stringify({
    state: state, // "visible" | "hidden"
    eventType: evt, // "visibilitychange" | "pagehide" | "pageshow" | "blur" | "focus" | "init"
    hidden: state === 'hidden',
    ts: Date.now()
  });
  try { SendMessage(goName, method, payload); } catch (e) {}
}

// 캡처 단계로 가장 먼저 잡는다(숨기기 직전에도 최대한 빨리 유니티 호출)
var opts = { capture: true, passive: true };

function onVisibility() { send(document.hidden ? 'hidden' : 'visible', 'visibilitychange'); }
function onPageHide()   { send('hidden',  'pagehide'); }
function onPageShow()   { send('visible', 'pageshow'); }
function onBlur()       { send(document.hidden ? 'hidden' : 'visible', 'blur'); }
function onFocus()      { send(document.hidden ? 'hidden' : 'visible', 'focus'); }
function onFreeze()     { send('hidden', 'freeze'); }

// 이벤트 구독
document.addEventListener('visibilitychange', onVisibility, opts);
window.addEventListener('pagehide', onPageHide, opts);
window.addEventListener('pageshow', onPageShow, opts);
window.addEventListener('blur', onBlur, opts);
window.addEventListener('focus', onFocus, opts);
window.addEventListener('freeze', onFreeze, opts);

// 초기 1회 상태 통지(필요 시)
send(document.hidden ? 'hidden' : 'visible', 'init');

// 이벤트 구독 해제 함수 정의
window.__tossVisUnsub = function () {
  document.removeEventListener('visibilitychange', onVisibility, opts);
  window.removeEventListener('pagehide', onPageHide, opts);
  window.removeEventListener('pageshow', onPageShow, opts);
  window.removeEventListener('blur', onBlur, opts);
  window.removeEventListener('focus', onFocus, opts);
  window.removeEventListener('freeze', onFreeze, opts);
};

}
});

// 유니티 코드
public void OnFocus(bool isFocus)
{
if (isFocus) // Foreground
{
// 사운드 Resume
AudioListener.pause = false;

    // 게임 Resume
    Time.timeScale = _originTimeScale;
}
else // Background
{
    // 사운드 Pause
    AudioListener.pause = true;
    
    // 게임 Pause
    _originTimeScale = Time.timeScale;
    Time.timeScale = 0;
}

}