You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:14:57