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

Unity射线检测敌人触发NullReferenceException的问题排查

问题排查与修复方案

核心错误分析

  1. 错误的组件初始化:GunScript的Awake方法中调用GetComponent<EnemyHealth>(),但GunScript挂载在玩家/枪支对象上,该对象并没有EnemyHealth组件,导致全局变量enemyHealth始终为null,后续调用TakeDamage必然触发空引用异常。
  2. 错误的组件获取与调用:Shoot方法中仅检测命中对象的父物体是否有EnemyHealth,忽略了命中对象自身挂载组件的情况;且即使检测到父物体的组件,也没有将其赋值给enemyHealth,依然使用原本的null变量调用方法。

修正后的GunScript代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GunScript : MonoBehaviour
{
    [SerializeField] Camera FPCamera;
    [SerializeField] float range = 100f;
    public float gunDamage = 50f;

    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            Shoot();
        }
    }

    private void Shoot()
    {
        RaycastHit hitObject;
        if (Physics.Raycast(FPCamera.transform.position, FPCamera.transform.forward, out hitObject, range))
        {
            // 先尝试从命中对象自身获取EnemyHealth组件
            EnemyHealth enemyHealth = hitObject.collider.gameObject.GetComponent<EnemyHealth>();
            
            // 如果自身没有,再尝试从父物体获取(根据你的场景需求选择是否保留)
            if (enemyHealth == null)
            {
                enemyHealth = hitObject.transform.parent.GetComponent<EnemyHealth>();
            }

            // 确认组件存在后调用扣血方法
            if (enemyHealth != null)
            {
                enemyHealth.TakeDamage(gunDamage);
            }
        }
    }
}

关键修改说明

  • 移除了全局enemyHealth变量的初始化逻辑,改为在射线命中时动态获取目标对象的组件,避免提前初始化的错误。
  • 优先检测命中对象自身的EnemyHealth组件,再按需检测父物体,覆盖更多挂载场景。
  • 直接使用获取到的有效组件调用TakeDamage,彻底避免空引用问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:35:24