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

Godot 4.2.1:如何基于鼠标位置检测GridMap网格单元

解决GridMap射线检测无结果的问题

核心排查与修复步骤

  • 检查GridMap碰撞层与掩码匹配
    确认GridMap的Collision Layer和射线查询的collision_mask一致。默认射线会检测所有层,但若GridMap修改了碰撞层,需手动设置查询掩码:

    var query := PhysicsRayQueryParameters3D.create(from, to)
    query.collision_mask = 1 << 0  # 假设GridMap在第1碰撞层
    
  • 启用GridMap碰撞体生成
    即使没有网格体,必须勾选GridMap检查器中Collision分类下的Create Collision选项——这是GridMap生成碰撞数据的前提,未开启则无法被射线检测到。

  • 调整射线长度与起点
    用camera.far作为长度可能因相机参数问题导致射线未覆盖GridMap,可先改用固定大值测试:

    var to = from + camera.project_ray_normal(mouse_position) * 1000.0
    

    若相机近裁剪面过大,射线起点可能在相机内部,可轻微偏移:

    var ray_dir = camera.project_ray_normal(mouse_position)
    var from = camera.project_ray_origin(mouse_position) + ray_dir * 0.1
    
  • 使用GridMap内置检测方法
    直接调用GridMap的localize_ray方法更精准,无需手动处理空间状态:

    func _physics_process(delta):
        var mouse_pos = camera.get_viewport().get_mouse_position()
        var ray_origin = camera.project_ray_origin(mouse_pos)
        var ray_dir = camera.project_ray_normal(mouse_pos)
        
        var hit = $GridMap.localize_ray(ray_origin, ray_dir)
        print(hit if hit else "未命中网格单元")
    

调试技巧

  • 开启编辑器Debug > Visible Collision Shapes,直观查看GridMap的碰撞形状是否正确生成。
  • 打印射线起点和终点坐标,确认范围覆盖GridMap:
    print("射线起点:", from, " 终点:", to)
    

内容的提问来源于stack exchange,提问作者Keshav Agrawal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:12:12