在 Windows 或 Editor 环境下,我们习惯用 Screen.fullScreen = !Screen.fullFullScreen 来控制全屏。但一旦项目发布到 WebGL,就会遇到各种诡异问题:
- 第一次点击没反应
- 有时需要点两次才能生效
- 偶尔直接报错
abort(-1) - 不同浏览器表现不一致
很多人第一反应是'Unity 的 bug',其实核心原因只有一个:WebGL 的全屏控制权在浏览器,不在 Unity。
为什么不能直接用 Screen.fullScreen?
浏览器出于安全考虑,对'进入全屏'有严格限制:
- 必须由用户手势触发(点击/按键)
- 不能在任意时机调用
- 不允许后台脚本随意请求
Screen.fullScreen 在 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.();
},
});

