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
相关产品推荐
相关产品推荐

