求助!有没有人成功在节点上添加 PickEvent 事件监听
-
我现在封装了一个类,实现了一些基本功能,这些功能中涉及到一些对于类内某些Object3D的点击和碰撞体内部的触发,这些点击相关事件可以通过 view.pickFire 监听成功调用并实现,但没有办法通过节点上添加 PickEvent 事件监听实现,没有报错,就是没有反应,代码内容如下:
//类的内部 private constructor(controller:HoverCameraController,rootObj:Object3D){ Engine3D.setting.pick.enable = true; Engine3D.setting.pick.mode = `pixel`; this.geoMap=new Object3D(); rootObj.addChild(this.geoMap); this.controller=controller; } loadChinaMap(){ this.loadGeoJsonMap(url); this.geoMap.addEventListener(PointerEvent3D.PICK_OVER, this.pickOver, this); this.geoMap.addEventListener(PointerEvent3D.PICK_OUT, this.pickOut, this); this.geoMap.addEventListener(PointerEvent3D.PICK_CLICK, this.pickClick, this); }
我只想关注我类所管控的节点的点击相关事件,有没有什么办法呢?
-
内置的
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);