内置的 pickfire
默认只在 meshrenderer
上触发相应的事件,为了性能和组件化的设计暂时并没有对应冒泡机制,你可以根据逻辑自定义pick的冒泡
let obj = new Object3D();
obj.name = 'clickable' // 比如自定义name,或者 obj.data 等辅助数据
obj.addChild(...) // 添加一些多级子节点,其中包括一些 mesh节点并添加了 ColliderComponent
// 默认是不会触发的, 但可以手动 dispatchEvent 触发
obj.addEventListener(PointerEvent3D.PICK_CLICK, this.pickClick, this);
// 以 click 为例,pickFire 统一添加 click 监听
view.pickFire.addEventListener(PointerEvent3D.PICK_CLICK, (e:PointerEvent3D)=>{
let target = e.target;
// 根据自定义逻辑,自动向上查找父节点,冒泡点击事件
while(target.name !== 'clickable'){
target = target.parentObject
// target.dispatchEvent(e) // 可以每一层都冒泡 dispatchEvent(e),但不推荐
}
target.dispatchEvent(e) // 最终在 obj 上触发 PICK_CLICK 事件,也可以自定义任意 event
}, this);