Godot中Raycast3D点击单个红色立方体失效问题求助
问题原因与修复方案
核心问题
- 共享材质实例:所有红色立方体使用同一个材质对象,修改
transparency时会同步影响所有使用该材质的立方体。 - Raycast引用冗余:脚本本身继承自RayCast3D,无需额外通过
raycast_path获取自身。 - 节点层级逻辑错误:
get_collider()返回的就是碰撞到的StaticBody3D,取owner会导致获取到错误的节点,甚至可能是同组的父节点。
修复步骤
1. 为每个立方体创建独立材质
在Godot编辑器中:
- 选中红色立方体的
MeshInstance3D节点 - 在Inspector面板找到
Material Override,点击材质旁边的箭头,选择Make Unique - 对所有红色立方体重复此操作,确保每个立方体拥有独立的材质实例
2. 修正脚本逻辑
简化Raycast引用,修正碰撞体获取与节点层级逻辑:
extends RayCast3D func _input(event): # 仅处理鼠标按下事件 if event is InputEventMouseButton and event.pressed: if is_colliding(): var collider = get_collider() # 检查碰撞体是否属于目标组 if "CuboRojo" in collider.get_groups(): # 获取对应的MeshInstance3D(根据你的节点结构调整索引) var cubo_mesh = collider.get_child(0) as GeometryInstance3D if not cubo_mesh or not cubo_mesh.material_override: return var material = cubo_mesh.material_override if event.button_index == MOUSE_BUTTON_LEFT: material.transparency = 0 collider.collision_layer = 1 | 2 elif event.button_index == MOUSE_BUTTON_RIGHT: material.transparency = 1 collider.collision_layer = 2
补充说明
- 确认节点结构:如果你的红色立方体是
StaticBody3D作为父节点,MeshInstance3D作为子节点,get_child(0)就能正确获取网格节点;如果结构不同,需要调整子节点索引。 - 组的位置:确保
CuboRojo组添加在StaticBody3D节点上,这样碰撞检测时能正确匹配到目标对象。
内容的提问来源于stack exchange,提问作者TheZombrex
相关产品推荐
相关产品推荐

