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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:04:53