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

Unity近战攻击僵尸时Physics.SphereCast触发NullReferenceException求助

空引用问题排查方案

你遇到的NullReferenceException并非Physics.SphereCast方法本身抛出,而是该行逻辑用到的某个引用变量为空导致,按以下步骤排查即可定位解决:

第一步:精准定位空对象

在Physics.SphereCast执行前添加调试日志,直接确认哪个变量未正确初始化:

// 插入到SphereCast代码行之前
Debug.Log($"sphereCastSpawn是否为空:{sphereCastSpawn == null}");
Debug.Log($"weaponHandler是否为空:{weaponHandler == null}");
if (weaponHandler != null) Debug.Log($"zombieLayer是否赋值:{weaponHandler.zombieLayer}");
Debug.Log($"当前选中武器是否为空:{weaponManager.GetCurrentSelectedWeapon() == null}");

运行后点击攻击看控制台输出,即可直接定位空引用来源。

第二步:常见问题修复

weaponHandler为空

GetComponentInChildren默认只会读取激活状态子物体上的组件,如果你的武器初始是禁用状态,Start执行时会获取失败,修改获取逻辑即可:

// 第二个参数传true,即可获取禁用物体上的组件
weaponHandler = GetComponentInChildren<WeaponHandler>(true);

当前武器为空

你连续两次调用weaponManager.GetCurrentSelectedWeapon(),如果执行过程中切换了武器,第二次调用可能返回空,建议先缓存当前武器:

var currentWeapon = weaponManager.GetCurrentSelectedWeapon();
if (currentWeapon != null && currentWeapon.tag == Tags.AXE_TAG)
{
    currentWeapon.ShootAnimation();
    // 后续SphereCast逻辑
}

命中对象无AiExample脚本

SphereCast可能先命中墙体、地面、自身武器模型等非僵尸对象,直接调用GetComponent<AiExample>()会返回空,需要加非空校验:

if(Physics.SphereCast(origin: sphereCastSpawn.position, 0.5f, sphereCastSpawn.forward,
    out hit, weaponHandler.zombieLayer))
{
    AiExample zombie = hit.transform.GetComponent<AiExample>();
    if(zombie != null)
    {
        zombie.DamageZombie(AxeDamage);
    }
}

zombieLayer参数错误

Physics.SphereCast的最后一个参数是层掩码(LayerMask),如果你weaponHandler.zombieLayer存的是层的序号(比如第8层存的是8),而不是掩码值(对应为1 << 8),会导致检测逻辑异常,建议改为直接声明LayerMask类型字段存储层级。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:39:03