Unity僵尸游戏射线检测异常求助:命中僵尸却触发后方对象
僵尸射击游戏射线检测误命中问题解决方案
1. 检查碰撞体触发器设置
Physics.Raycast默认忽略标记为Trigger的碰撞体。若僵尸的Collider勾选了Is Trigger,射线会直接穿透。解决方式:
- 取消僵尸所有Collider(HeadCollider、BodyCollider等)的
Is Trigger勾选; - 或修改射线检测代码,强制包含触发器:
if (Physics.Raycast(ray, out RaycastHit hit, MaxDistance, EnabledLayer, QueryTriggerInteraction.Collide))
2. 严格校验层级匹配
确认:
- 僵尸所有带Collider的子对象Layer与
EnabledLayer完全一致; - 后方被误命中的对象不在
EnabledLayer指定层级内,避免射线检测范围包含无关目标。
3. 排查碰撞体有效性
- 在Scene视图开启碰撞体可视化(Gizmos -> Colliders),检查僵尸碰撞体是否完整包裹模型,有无偏移、尺寸过小导致射线穿透;
- 确认僵尸移动/动画逻辑未导致碰撞体与模型错位。
4. 改用多命中检测确保精度
替换Physics.Raycast为Physics.RaycastAll,获取所有命中对象后取最近的僵尸:
RaycastHit[] hits = Physics.RaycastAll(ray, MaxDistance, EnabledLayer, QueryTriggerInteraction.Collide); if (hits.Length > 0) { Array.Sort(hits, (a, b) => a.distance.CompareTo(b.distance)); RaycastHit closestHit = hits[0]; Debug.LogError("What did I hit: " + closestHit.collider.gameObject.name); if (closestHit.collider.gameObject.CompareTag(HittableTag)) { Zombie_PTH zombie = closestHit.collider.transform.root.GetComponent<Zombie_PTH>(); string name = closestHit.collider.gameObject.name.Trim(); if (name.Contains("HeadCollider")) zombie.HitYedim(HitType.Kafa, getMousePos); else zombie.HitYedim(HitType.Govde, getMousePos); Instantiate(BloodParticle, closestHit.point, Quaternion.identity); } }
5. 修正僵尸脚本获取逻辑
原GetComponentInParent<Zombie_PTH>()可能因层级问题获取失败,改为从根节点获取更可靠:
Zombie_PTH zombie = closestHit.collider.transform.root.GetComponent<Zombie_PTH>();
6. 强化调试可视化
保留Debug.DrawRay的同时,绘制射线到命中点的红色线段,直观确认命中位置:
Debug.DrawLine(ray.origin, closestHit.point, Color.red, 1f);
内容的提问来源于stack exchange,提问作者Kaan Can Sürdem
相关产品推荐
相关产品推荐

