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
相关产品推荐
相关产品推荐

