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

Unity C# 血条脚本功能正常却触发空引用错误求助

问题分析与解决

错误原因

你遇到的Object reference not set to an instance of an object空引用异常,根源是TakeDamage方法中访问了未初始化的对象成员。具体指向第61行的stats.Armor.GetValue()代码,可能的两种情况:

  • stats变量未在Unity编辑器中赋值:作为public字段,你需要将带有CharacterStats组件的对象拖入HealthBar的stats属性栏;
  • stats已赋值,但stats.Armor本身是null:比如CharacterStats类中Armor属性未被正确实例化。

你提到调用TakeDamage时功能符合预期却报错,大概率是代码逻辑中某些分支偶然避开了空引用,但核心的对象未初始化问题依然存在。

修复方案

  1. 检查Inspector赋值
    选中挂载HealthBar脚本的对象,在Inspector面板中确认stats字段已拖入正确的CharacterStats实例。

  2. 添加空值保护逻辑
    修改TakeDamage方法,先判断对象是否为空再执行后续逻辑,避免触发异常:

    void TakeDamage(int damage)
    {
        // 先校验stats和Armor是否有效
        if (stats != null && stats.Armor != null)
        {
            if (stats.Armor.GetValue() <= damage) { 
                damage -= stats.Armor.GetValue();
                damage = Mathf.Clamp(damage, 0, int.MaxValue);
    
                slider.value -= damage;
            }
        }
        else
        {
            // 无护甲时直接扣除对应血量
            slider.value -= damage;
        }
        
        if (slider.value <= 0)
        {
            Dead();
        }
    }
    
  3. 校验CharacterStats类
    打开CharacterStats脚本,确认Armor属性已被正确初始化:如果Armor是自定义类,要确保它在CharacterStats的Start/Awake方法中被实例化,或者通过Inspector完成赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:30:57