最近公司有几款游戏在Facebook Instant Games平台上,都因报同一个错误而无法进入游戏,这些游戏中有Cocos Creator的项目,也有Unity的项目。
从错误中可以看出,是Navigator.getGamepads()
的调用被Facebook的权限策略阻止了。
Navigator.getGamepads()
是什么
Navigator.getGamepads()
是一个 Web API 方法,用于返回一个包含当前连接的游戏手柄信息的数组。每个手柄可以通过索引访问,提供按钮和轴的状态信息。
原因
这个是Facebook Instant Games游戏页面的HTTP响应头的权限策略。
Permissions-Policy: gamepad=(self)
这个设置表示只有在相同的源(即和页面拥有相同协议、域名和端口的脚本)中才允许使用 Gamepad API。这是一种安全措施,用以限制可能来自不同源的脚本访问敏感或影响用户体验的功能。
简单来说,这意味着只有来自与当前网页相同源的脚本才能访问 Navigator.getGamepads()
方法。如果尝试从其他源的脚本访问此功能,将会受到限制。
临时解决方案
Cocos Creator项目:
Unity项目:
上面两张截图gamepad
的调用都是在引擎初始化的时候,由引擎底层调用,因此为了能在Facebook Instant Games
上正常运行,一个解决方案就是在引擎初始化之前将navigator.getGamepads
设置为null,就可以避免navigator.getGamepads
的调用,当然这个只是临时方案,想要完全解决这个问题,只能由引擎公司来修正,比如开放一个手柄的开关,或者在打包的时候,可以将游戏手柄模块从引擎中裁切掉。
引擎版本适用范围
Cocos Creator 3.6.1开始为了更好的支持XR
, 增加了对游戏手柄的支持,因此3.6.1
以上的游戏想上架到Facebook Instant Games平台上,需要禁用navigator.getGamepads
的调用
至于Unity的项目,我不是很清楚具体是从哪个版本开始支持游戏手柄,从公司上架的项目来看,2020.3.46f1c1
以上的版本,都需要禁用navigator.getGamepads
的调用