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

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)这行代码,核心原因是以下两者之一为空:

  1. GameManager.gameManager静态实例未初始化——场景中没有挂载GameManager脚本的物体,或者其Awake方法未先于PlayerBehaviour执行
  2. 额外冗余问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:42:53