FXGL中3D实体点击事件无法触发,如何解决?
FXGL 3D实体鼠标点击事件不触发的解决办法
1. 启用实体拾取功能
FXGL的3D实体默认未开启拾取,这是点击事件不触发的核心原因之一,需显式开启:
Entity entity = entityBuilder(data) .at(data.getX(), data.getY(), data.getZ()) .viewWithBBox(box) .with(new IDComponent(data.get("name"), data.get("id"))) .pickable(true) // 关键:开启3D拾取支持 .onClick(e->{ System.out.println("click box"); }) .build();
也可在实体构建后补设置:
entity.setPickable(true);
2. 排查相机与视角问题
- 确认实体处于相机视锥体内,可临时将相机移动至实体附近测试点击是否生效
- 确保使用透视相机(FXGL默认3D场景为透视相机),正交相机可能导致拾取射线计算偏差
3. 验证材质与绘制模式影响
若使用透明材质或自定义渲染状态,可能干扰拾取检测。先替换为默认材质测试:
box.setMaterial(MaterialFactory.newInstance().diffuseColor(Color.RED).build());
4. 改用全局3D拾取事件
如果实体绑定的onClick仍不生效,可通过全局鼠标事件结合3D拾取接口实现:
// 在游戏主类的init()方法中添加 getInput().addEventHandler(MouseEvent.MOUSE_CLICKED, e -> { List<Entity> pickedEntities = getGameWorld().pickAll3D(e.getX(), e.getY()); for (Entity entity : pickedEntities) { if (entity.hasComponent(IDComponent.class)) { System.out.println("click box"); } } });
5. 检查碰撞盒配置
viewWithBBox(box)会自动生成碰撞盒,但模型尺寸特殊时,需手动指定确保拾取范围准确:
.bbox(new BoundingBox(0, 0, 0, PlotConstant.WIDTH_X, PlotConstant.DEEP_Y, PlotConstant.LENGTH_Z))
内容的提问来源于stack exchange,提问作者rqcx
相关产品推荐
相关产品推荐

