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

