[3.4.2] 全局监听input输入触摸事件的workaround

关于“输入事件系统”,官方文档里有这么一句

注意 :我们在 v3.4.1 中降低了 input 优先级,因此二者从 v3.4.1 开始在优先级上已经不存在差异了。

也就是说,使用input监听触摸/点击事件的时候,如果某个UI元素注册了相关事件监听(不管是捕获还是冒泡),且UITransformisHit命中,全局的input就收不到相关事件,因为事件被直接发往了优先级更高的PointerEventDispatcher

我在找解决方案的时候也看到了这些帖子:


这里我有个简单的workaround,那就是注册一个更高优先级的IEventDispatcher,并且在dispatchEvent中直接返回true,只监听而不消费事件。

注意:使用了非公开API,仅做了简单测试,谨慎使用

import { Event, EventTarget, input } from "cc";

export class HighPriorityGlobalInput extends EventTarget implements IEventDispatcher {

    constructor(priority = 999) {
        super();
        this.priority = priority;
        input['_registerEventDispatcher'](this);
    }

    readonly priority: number;

    dispatchEvent(event: Event): boolean {
        this.emit(event.type, event);
        return true;
    }
}

interface IEventDispatcher {
    readonly priority: number;
    dispatchEvent(event: Event): boolean;
}

export const highPriorityGlobalInput = new HighPriorityGlobalInput();

使用方法就是用highPriorityGlobalInput替换input即可。

4赞

修改排序,思路不错,可行

初步测试, 可行 :+1:

好用,感谢大佬