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

Unity C#实现FPS后坐力报NullReferenceException空引用错误

报错原因

你遇到的是典型的空引用异常,触发位置在Assets/Script/ShootingBullet.cs第28行的Start方法内:

Recoil_Script=transform.Find("CameraRot/CameraRecoil").GetComponent<Recoil>();

transform.Find()仅会检索当前脚本所挂载游戏对象的子层级,这行代码返回空只有两种原因:

  • 填写的层级路径CameraRot/CameraRecoil和实际Hierarchy面板中的物体命名、层级关系不匹配
  • CameraRot/CameraRecoil对象不属于挂载ShootingBullet脚本对象的子物体,Find方法无法检索到
    找不到对应对象时,后续直接调用GetComponent<Recoil>()就会抛出空引用错误。
解决方案

以下方案任选其一即可:

  1. 最推荐方案:删除Start方法内所有查找赋值的代码,直接在Inspector面板中,把挂载了Recoil脚本的CameraRecoil对象拖拽到ShootingBullet组件的Recoil_Script字段上完成赋值,完全避免路径查找出错的问题。
  2. 修正查找逻辑:如果不想手动拖拽赋值,先确认CameraRecoil的实际层级,如果它不在当前脚本物体的子层级下,不要使用transform.Find,可以改用GameObject.Find("CameraRecoil")(需保证场景内无重名对象)查找,或者给CameraRecoil设置专属Tag,用GameObject.FindWithTag()查找后再获取组件。
  3. 增加容错判断:修改Start方法代码,避免直接报错阻断运行:
    void Start() 
    {
        Transform recoilObj = transform.Find("CameraRot/CameraRecoil");
        if (recoilObj != null)
        {
            Recoil_Script = recoilObj.GetComponent<Recoil>();
        }
        else
        {
            Debug.LogError("层级路径CameraRot/CameraRecoil查找失败,请检查对象命名与父子层级关系");
        }
    }
    
额外优化建议

你写的Recoil.cs中,snapiness和returnSpeed两个序列化字段没有设置默认值,如果忘记在Inspector中赋值,后坐力效果会完全失效,建议给两个字段设置合理默认值:

[SerializeField] private float snapiness = 6f;
[SerializeField] private float returnSpeed = 10f;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:27:30