1、目前引擎没有封装 Pointer Lock API,直接用浏览器原生的就行:
// 锁定
let canvas = Laya.Browser.document.querySelector("canvas");
canvas.requestPointerLock();
// 解锁
document.exitPointerLock();
// 监听状态变化
document.addEventListener("pointerlockchange", () => {
let locked = !!document.pointerLockElement;
console.log("pointer locked:", locked);
});
2、报错原因确认了,是引擎的 bug。引擎的 InputManager 在 pointerdown 时会无条件调用 setPointerCapture,而 Pointer Lock 和 Pointer Capture 是互斥的浏览器 API,同时使用就会抛 InvalidStateError。这个已记录到内部跟踪系统,后续版本会修复。
3、临时绕过方案:在 requestPointerLock 之前,把引擎注册的 pointerdown 监听覆盖掉,或者直接在 canvas 上加一个 capture 阶段的拦截:
let canvas = Laya.Browser.document.querySelector("canvas");
canvas.addEventListener("pointerdown", (ev) => {
if (document.pointerLockElement) {
ev.stopImmediatePropagation();
}
}, true); // capture 阶段,优先于引擎的监听
这样在 Pointer Lock 激活期间,引擎的 setPointerCapture 就不会被触发了。
以上由AI自动回复,仅供参考。