关于“输入事件系统”,官方文档里有这么一句
注意 :我们在 v3.4.1 中降低了
input优先级,因此二者从 v3.4.1 开始在优先级上已经不存在差异了。
也就是说,使用input监听触摸/点击事件的时候,如果某个UI元素注册了相关事件监听(不管是捕获还是冒泡),且UITransform的isHit命中,全局的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即可。
