Unity玩家生命值系统报错:NullReferenceException问题求助
解决PlayerTakeDmg触发的NullReferenceException空引用异常
异常信息
NullReferenceException: Object reference not set to an instance of an object
PlayerBehaviour.PlayerTakeDmg (System.Int32 dmg) (at Assets/Scripts/PlayerBehaviour.cs:82)
PlayerBehaviour.Update () (at Assets/Scripts/PlayerBehaviour.cs:25)
问题原因
异常指向GameManager.gameManager._playerHealth.DmgUnit(dmg)这行代码,核心原因是以下两者之一为空:
GameManager.gameManager静态实例未初始化——场景中没有挂载GameManager脚本的物体,或者其Awake方法未先于PlayerBehaviour执行- 额外冗余问题:
PlayerBehaviour自身定义了_playerHealth字段但完全未使用,容易造成逻辑混淆
解决方案
1. 确保场景存在唯一的GameManager实例
- 在场景中创建空物体并命名为
GameManager,将GameManager脚本挂载到该物体上 - 检查场景中是否有多个挂载
GameManager的物体,单例逻辑会自动销毁多余实例,但必须保证至少存在一个
2. 调整脚本执行顺序
如果PlayerBehaviour的Update比GameManager的Awake先执行,会导致gameManager仍为null:
- 打开Unity编辑器,进入
Edit > Project Settings > Script Execution Order - 将
GameManager拖动到PlayerBehaviour上方,确保GameManager先完成初始化
3. 清理冗余代码
删除PlayerBehaviour中未使用的_playerHealth字段,避免逻辑混乱:
// 移除PlayerBehaviour中的该行代码 // public UnitHealth _playerHealth = new UnitHealth(100, 100);
4. 增加空值检查(可选,提升鲁棒性)
在访问GameManager实例时增加判断,避免崩溃并输出明确错误信息:
private void PlayerTakeDmg(int dmg) { if (GameManager.gameManager == null) { Debug.LogError("GameManager实例未找到,请确保场景中有挂载GameManager脚本的物体"); return; } if (GameManager.gameManager._playerHealth == null) { Debug.LogError("GameManager中的_playerHealth未初始化"); return; } GameManager.gameManager._playerHealth.DmgUnit(dmg); }
额外代码优化
OnCollisionEnter2D存在重复判断逻辑,直接删除重复部分:
private void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.tag == "DmgObject") { PlayerTakeDmg(20); Debug.Log(GameManager.gameManager._playerHealth.Health); } }
内容的提问来源于stack exchange,提问作者wuta
相关产品推荐
相关产品推荐

