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不一致。
解决方法
- 获取场景中有效组件实例:不要用
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(); } }
- 确保组件已挂载:在Unity编辑器中,将Child组件挂载到某个GameObject上,这样
FindObjectOfType才能找到有效实例。
内容的提问来源于stack exchange,提问作者josep16388
相关产品推荐
相关产品推荐

