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

Unity中Raycast命中子对象,无法获取父对象PlainTerrain脚本

解决Unity Raycast命中子对象无法获取父脚本的问题

这里给你几个直接能用的解决思路:

方法1:从命中对象向上查找父级组件

这是最直接的办法,不管射线打中的是哪个子对象,直接通过GetComponentInParent沿着父级链找到你需要的PlainTerrain脚本。修改代码如下:

if(Physics.Raycast(transform.position, transform.TransformDirection(Vector3.down), out RaycastHit hitInfo, 1f)) 
{
    Debug.Log(hitInfo.transform.gameObject);
    // 向上查找PlainTerrain脚本,会遍历所有父对象直到找到
    PlainTerrain terrainScript = hitInfo.transform.GetComponentInParent<PlainTerrain>();
    if(terrainScript != null)
    {
        // 这里可以使用terrainScript执行逻辑
        Debug.Log("成功获取PlainTerrain脚本");
    }
}

方法2:限制射线检测的层级

如果不想让射线命中子对象的Collider,可以给父对象PlainTerrain单独设置一个层级,让射线只检测这个层级:

  • 在Unity编辑器中新建一个层级(比如命名为TerrainParent)
  • 将PlainTerrain对象的层级设置为这个新建层级
  • 修改Raycast代码,加入层级掩码:
// 生成只检测TerrainParent层级的掩码
int terrainLayerMask = 1 << LayerMask.NameToLayer("TerrainParent");
// 最后一个参数传入掩码,射线只会命中该层级的Collider
if(Physics.Raycast(transform.position, transform.TransformDirection(Vector3.down), out RaycastHit hitInfo, 1f, terrainLayerMask)) 
{
    Debug.Log(hitInfo.transform.gameObject);
    // 此时命中的是PlainTerrain对象,直接GetComponent就能拿到脚本
    PlainTerrain terrainScript = hitInfo.transform.GetComponent<PlainTerrain>();
}

方法3:调整子对象的Collider

如果子对象的Collider不需要参与射线检测,可以:

  • 勾选子对象Collider组件的Is Trigger选项(这样射线会忽略它)
  • 或者直接禁用子对象的Collider组件(注意不要影响其他依赖该Collider的功能)

内容的提问来源于stack exchange,提问作者Peter Moore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:22:03