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

Unity使用枚举与C#属性访问器时报空引用异常排查

问题根因

空引用由Start生命周期内代码执行顺序错误导致,和C#属性访问器语法、Inspector面板的Sprite资源赋值无关。
你当前Start方法的执行逻辑顺序存在问题:

void Start() {
    State = defaultState;
    sprite = gameObject.GetComponent<SpriteRenderer>();
}

当第一行State = defaultState执行时,会立刻触发State的set访问器逻辑,此时sprite私有字段还没执行第二行的GetComponent赋值,值为null,执行sprite.sprite = full时访问了空对象的属性,直接抛出空引用异常。
Visual Studio无法检测到这类运行时逻辑错误,你检查到的full等Sprite字段确实已经正常赋值,真正为空的是还没完成初始化的sprite(SpriteRenderer类型)字段。

修复方案

调换Start方法内两行代码的顺序,先完成SpriteRenderer组件的获取赋值,再设置初始状态:

void Start() {
    // 先获取组件引用,完成sprite字段初始化
    sprite = gameObject.GetComponent<SpriteRenderer>();
    // 所有依赖字段初始化完成后,再设置State触发sprite修改
    State = defaultState;
}
优化建议
  • 可以在State的set访问器开头增加空值兜底,避免其他逻辑提前调用State时触发同类报错:
    set {
        if (sprite == null) sprite = GetComponent<SpriteRenderer>();
        // 原有switch逻辑不变
        switch(value) {
            case BarState.Super:
                sprite.sprite = super;
                break;
            case BarState.Full:
                sprite.sprite = full;
                break;
            case BarState.Half:
                sprite.sprite = half;
                break;
            case BarState.Empty:
                sprite.sprite = empty;
                break;
        }
        _state = value;
    }
    
  • 组件获取类的逻辑建议放到Awake生命周期执行,Awake执行时机早于所有脚本的Start,可以避免跨脚本调用时出现引用未初始化的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:42:16