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

Godot中Raycast3D点击单个红色立方体失效问题求助

问题原因与修复方案

核心问题

  1. 共享材质实例:所有红色立方体使用同一个材质对象,修改transparency时会同步影响所有使用该材质的立方体。
  2. Raycast引用冗余:脚本本身继承自RayCast3D,无需额外通过raycast_path获取自身。
  3. 节点层级逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:18:24