Unity WebGL如何打开未聚焦新标签页?解决应用暂停问题
解决Unity WebGL打开未聚焦新标签页的问题
Unity的Application.OpenURL在WebGL环境中会强制让新标签页获取焦点,导致原应用所在标签失焦后被浏览器暂停——即使开启了"Run in background"设置也无效,因为该设置仅对原生平台生效,浏览器的标签页生命周期由自身规则控制。要实现打开新标签但不抢占焦点,需要通过JS互操作调用浏览器原生API:
步骤1:创建WebGL插件脚本
在Unity项目的Assets/Plugins/WebGL目录下新建一个.jslib文件(比如命名为UnfocusedTab.jslib),写入以下代码:
mergeInto(LibraryManager.library, { OpenUnfocusedTab: function(url) { // 转换Unity传入的UTF8字符串为JS字符串 const jsUrl = Pointer_stringify(url); // 打开新标签,指定参数阻止聚焦 const newTab = window.open(jsUrl, '_blank', 'noopener,noreferrer,focus=no'); // 兼容部分浏览器:强制原窗口重新获取焦点 if (newTab) { window.focus(); } } });
步骤2:在C#中调用JS方法
创建一个C#脚本(比如TabOpener.cs),导入JS方法并绑定到用户交互事件:
using UnityEngine; using System.Runtime.InteropServices; public class TabOpener : MonoBehaviour { [DllImport("__Internal")] private static extern void OpenUnfocusedTab(string url); // 绑定到UI按钮的OnClick事件 public void OpenTabWithoutFocus(string targetUrl) { #if UNITY_WEBGL && !UNITY_EDITOR OpenUnfocusedTab(targetUrl); #else // 编辑器下用默认方式打开 Application.OpenURL(targetUrl); #endif } }
关键注意事项
- 浏览器安全限制:必须通过用户主动交互(比如按钮点击、键盘输入)触发调用,否则浏览器会拦截弹出窗口,无法自动在后台打开新标签。
- 兼容性处理:部分浏览器对
focus=no参数支持有限,代码中额外添加的window.focus()可以强制原窗口重新聚焦,是更可靠的兼容方案。 - 安全参数:
noopener,noreferrer必须添加,既可以避免安全风险,也能让新标签页与原窗口完全隔离,减少浏览器的聚焦行为干扰。
内容的提问来源于stack exchange,提问作者WolfPG
相关产品推荐
相关产品推荐

