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

Unity3D继承异常问题:子类m_hp值输出不一致求解

Unity继承中m_hp值不一致的问题分析

问题现象

运行代码后,Child类Update方法中的m_hp持续递减,但Main类中调用GetBossHPFillAmount()时输出的m_hp始终为初始值2000,两处m_hp值无法同步。

涉及代码

Parent类

using UnityEngine;

public class Parent : MonoBehaviour
{
    protected float m_hp = 2000;

    public virtual float GetBossHPFillAmount()
    {
        Debug.Log("Parent m_hp   "+m_hp);
        return 0;
    }
}

Child类

using UnityEngine;

public class Child : Parent
{
    void Update()
    {
        m_hp--;
        Debug.Log("Child Update m_hp   "+m_hp);
    }

    public override float GetBossHPFillAmount()
    {
        Debug.Log("Child m_hp   "+m_hp);
        return m_hp;
    }
}

Main类

using UnityEngine;

public class Main : MonoBehaviour
{
    private Parent m_parent;
  
    void Start()
    {
        m_parent = new Child();
    }

    void Update()
    {
        m_parent.GetBossHPFillAmount();
    }
}

问题原因

核心错误在于Unity的MonoBehaviour子类不能通过new关键字实例化。MonoBehaviour是Unity专为组件设计的基类,必须挂载到场景中的GameObject上才能被Unity的生命周期系统(比如Update)管理,脱离GameObject的实例不具备正常的组件行为:

  • 场景中挂载了Child组件的GameObject,其Update循环修改的是该组件实例的m_hp
  • Main类中new Child()创建的是一个脱离Unity场景的“孤立”实例,这个实例不会被Unity的生命周期调用,且它的m_hp始终保持初始值2000,Main调用的正是这个无效实例的GetBossHPFillAmount(),所以输出值和Child组件的m_hp不一致。

解决方法

  1. 获取场景中有效组件实例:不要用new创建MonoBehaviour对象,改用Unity提供的组件查找方法获取场景中已挂载的Child组件:
using UnityEngine;

public class Main : MonoBehaviour
{
    private Parent m_parent;
  
    void Start()
    {
        // 查找场景中第一个Child组件实例
        m_parent = FindObjectOfType<Child>();
    }

    void Update()
    {
        // 避免空引用报错
        if(m_parent != null)
            m_parent.GetBossHPFillAmount();
    }
}
  1. 确保组件已挂载:在Unity编辑器中,将Child组件挂载到某个GameObject上,这样FindObjectOfType才能找到有效实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:06:13