【问题标题】:unity3d webgl mute the sound when tab or browser inactiveunity3d webgl 在选项卡或浏览器不活动时静音
【发布时间】:2021-03-12 16:05:50
【问题描述】:

有没有人知道当标签页或浏览器处于非活动状态时在游戏中静音的正确方法?

我已经尝试通过this(通过 JS 库)的方式来做到这一点

var hidden, visibilityChange;
if (typeof document.hidden !== "undefined") {
    hidden = "hidden";
    visibilityChange = "visibilitychange";
} else if (typeof document.mozHidden !== "undefined") {
    hidden = "mozHidden";
    visibilityChange = "mozvisibilitychange";
} else if (typeof document.msHidden !== "undefined") {
    hidden = "msHidden";
    visibilityChange = "msvisibilitychange";
} else if (typeof document.webkitHidden !== "undefined") {
    hidden = "webkitHidden";
    visibilityChange = "webkitvisibilitychange";
}

document.addEventListener(visibilityChange, handleVisibilityChange, false);

function handleVisibilityChange() {
    $("video").prop('muted', document[hidden]);
}

但它不适合我。谢谢。

【问题讨论】:

    标签: javascript unity3d


    【解决方案1】:

    不确定,但您可能可以在 Unity 中的控制器组件上使用 OnApplicationFocusOnApplicationPause

    然后它可以通过简单地设置AudioListener.pause或相应地设置AudioListener.volume来启用和禁用所有声音

    public class FocusSoundController : MonoBehaviour
    {
        void OnApplicationFocus(bool hasFocus)
        {
            Silence(!hasFocus);
        }
    
        void OnApplicationPause(bool isPaused)
        {
            Silence(isPaused);
        }
    
        private void Silence(bool silence)
        {
            AudioListener.pause = silence;
            // Or / And
            AudioListener.volume = silence ? 0 : 1;
        }
    }
    

    【讨论】:

      【解决方案2】:

      虽然使用 OnApplicationFocus 会起作用,但如果它们切换到另一个窗口,它也会静音,但您仍然可以看到可能不是您想要的浏览器。

      如果您转到下面线程的底部,您会看到来自 Unity 的某个人的帖子,他们给出了一个示例,该示例使用与原始帖子中的内容类似的可见性更改,但也有您的 Unity C# 方面需要真正让它工作。我不喜欢硬编码对象名称,所以我在它调用 register 函数时传递了它的 gameObject.name。我不习惯使用jslib 插件,所以最初,我没有使用Pointer_stringify(str) 将指针转换为jslib 中的字符串。如果您这样做,您还需要将其设置为本地 var,或者当事件触发时,您的字符串指针可以是任何东西。

      Pause and Tabbing Events

      【讨论】:

      • 我忘了提到编辑器不喜欢尝试运行与 registerVisiblilityChangeEvent 相关的代码,所以我在该代码周围放置了一个“#if UNITY_WEBGL && !UNITY_EDITOR”。否则你会得到一个“EntryPointNotFoundException: registerVisibilityChangeEvent 错误。
      猜你喜欢
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2022-12-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 2016-01-16
      相关资源
      最近更新 更多