在 Windows / Editor 环境里,我们通常会这样控制全屏:
Screen.fullScreen = !Screen.fullScreen;
但当项目切到 WebGL 后,就会遇到各种奇怪问题:
- 第一次点击没反应
- 有时需要点两次才能全屏
- 偶尔直接
abort(-1) - 不同浏览器行为还不一致
很多人第一反应是'是不是 Unity 的 bug',但其实原因只有一个:WebGL 的全屏是浏览器行为,而不是 Unity 行为。
一、为什么 WebGL 下不能直接用 Screen.fullScreen?
浏览器对'进入全屏'有严格限制:
- 必须由用户手势触发(点击 / 按键)
- 不能在任意时机调用
- 不允许 Unity 在后台随意请求全屏
Screen.fullScreen 在 WebGL 中只是一次尝试性的请求,浏览器有权拒绝它,这就造成了各种'不稳定现象'。
二、正确做法:使用 Unity 官方的 WebGL 全屏接口
WebGL 环境下,请只使用 gameInstance.SetFullscreen(1)。这是 Unity 官方提供的 WebGL 全屏接口,不是 Hack,也不是私有 API。
三、整体实现思路
Unity UI Button 点击(用户手势) ↓ C# 调用 JavaScript(DllImport) ↓ JS 调用 gameInstance.SetFullscreen(1 / 0)
只要保证调用链路来自真实点击事件,浏览器就不会拦截。
四、创建 WebGL 插件(.jslib)
文件路径
Assets/Plugins/WebGL/Fullscreen.jslib
.jslib 的作用是:从 Unity C# 调用 JavaScript 代码
Fullscreen.jslib 内容
mergeInto(LibraryManager.library, {
// 进入全屏
WebGL_SetFullscreen: function () {
// gameInstance 是 Unity WebGL 导出时自动生成的全局对象
if (typeof gameInstance === 'undefined' || !gameInstance) {
console.error();
;
}
gameInstance.();
},
: () {
( gameInstance === || !gameInstance) {
.();
;
}
gameInstance.();
},
});
