Unity提示对象引用未设置错误,已声明变量仍触发NullReferenceException
问题描述
Unity开发过程中触发NullReferenceException(对象引用未设置为对象实例)报错,报错定位在代码第14、26行,已在第8行声明对应变量但依然触发报错。
HealthPoint类定义代码
using UnityEngine; public class HealthPoint { public float max; public float min = 0; public float current; }
触发报错的Obstacle类代码
using UnityEngine; public class Obstacle : MonoBehaviour { [SerializeField] private float MaxHp = 100; [SerializeField] private float MinHp = 0; private HealthPoint hp; SpriteRenderer spriteRenderer; private void Start() { hp.max = MaxHp; hp.min = MinHp; hp.current = MaxHp; } public void GotHit(float HitPoint) { hp.current -= 20; } private void Update() { float color = (int)(hp.current / 100); spriteRenderer.color = new Color(color, color, color); } }
问题根源
引用类型变量仅声明未初始化,默认值为null,调用null对象的属性/方法就会触发对象引用不存在报错:
- 自定义类HealthPoint是引用类型,仅声明
private HealthPoint hp未创建实例 - SpriteRenderer组件未通过GetComponent获取挂载在当前GameObject上的实例
修复后完整代码
using UnityEngine; public class Obstacle : MonoBehaviour { [SerializeField] private float MaxHp = 100; [SerializeField] private float MinHp = 0; private HealthPoint hp; private SpriteRenderer spriteRenderer; private void Start() { spriteRenderer = gameObject.GetComponent<SpriteRenderer>(); hp = new HealthPoint(); hp.max = MaxHp; hp.min = MinHp; hp.current = MaxHp; } public void GotHit(float HitPoint) { hp.current -= HitPoint; } private void Update() { float color = hp.current / 100; spriteRenderer.color = new Color(color, color, color); } }
修复点说明
- 新增
hp = new HealthPoint()创建HealthPoint类实例 - 新增
spriteRenderer = gameObject.GetComponent<SpriteRenderer>()获取当前物体上的SpriteRenderer组件实例 - 修复GotHit方法逻辑,将固定扣20改为使用传入的HitPoint参数
- 移除Update方法中多余的int强制转换,避免颜色值被截断为0或1,实现血量对应的灰度渐变效果
内容的提问来源于stack exchange,提问作者semih yılmaz
相关产品推荐
相关产品推荐

