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>()就会抛出空引用错误。
解决方案
以下方案任选其一即可:
- 最推荐方案:删除Start方法内所有查找赋值的代码,直接在Inspector面板中,把挂载了
Recoil脚本的CameraRecoil对象拖拽到ShootingBullet组件的Recoil_Script字段上完成赋值,完全避免路径查找出错的问题。 - 修正查找逻辑:如果不想手动拖拽赋值,先确认
CameraRecoil的实际层级,如果它不在当前脚本物体的子层级下,不要使用transform.Find,可以改用GameObject.Find("CameraRecoil")(需保证场景内无重名对象)查找,或者给CameraRecoil设置专属Tag,用GameObject.FindWithTag()查找后再获取组件。 - 增加容错判断:修改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
相关产品推荐
相关产品推荐

