Unity重写基类虚方法 如何在原有if分支中追加额外执行语句
Unity C# 子类重写计时销毁方法追加自定义逻辑实现方案
前置避坑
不要直接在子类重写方法中简单调用base.DestroyByTime()尝试复用逻辑:基类方法在时间归零时会直接执行Destroy(gameObject),如果把自定义逻辑写在base调用前,会出现时间未耗尽就触发GameOver的问题;写在base调用后,对象已经被销毁,自定义逻辑根本不会执行。
方案1:重构基类拆分逻辑(工程化推荐)
把基类中「时间耗尽时执行的逻辑」单独抽成可重写的虚方法,子类仅需重写这部分逻辑即可,完全复用基类的计时、时间判断逻辑,无代码重复问题,后续维护成本最低。
修改后的基类A代码
public class A : MonoBehaviour { // 注意:原代码未声明timeLeft,需将访问修饰符设为protected供子类继承访问 protected float timeLeft = 10f; // 初始值按实际业务需求调整 public virtual void DestroyByTime() { timeLeft -= Time.deltaTime; if (timeLeft <= 0) { OnTimeOut(); } } /// <summary> /// 时间耗尽触发的逻辑,子类可重写追加自定义行为 /// </summary> protected virtual void OnTimeOut() { Destroy(gameObject); } private void Update() { DestroyByTime(); } }
子类B实现代码
public class B : A { // 按项目实际规则获取GameSession引用,可通过序列化拖拽、单例访问等方式赋值 private GameSession gameSession; protected override void OnTimeOut() { // 追加自定义的游戏结束逻辑 gameSession.GameOver(); // 保留基类原有的销毁逻辑 base.OnTimeOut(); } }
该方案优势:
- 所有计时、时间判断逻辑统一在基类维护,后续如果要调整计时规则(比如加时间缩放、暂停判断、buff增减时长),仅需修改基类一次,所有子类自动生效
- 子类不需要重复编写任何基类已有逻辑,只需要关注自身需要追加的自定义部分
方案2:不修改基类的兼容实现(不推荐)
如果受场景限制完全不能改动基类A的代码,只能在子类重写时完整复写基类逻辑,在时间耗尽的if分支内插入自定义代码。
注意:该方案要求基类的
timeLeft字段必须是protected或public修饰,如果是private字段子类无法访问,该方案不可用,必须使用方案1。
public class B : A { private GameSession gameSession; public override void DestroyByTime() { timeLeft -= Time.deltaTime; if (timeLeft <= 0) { // 追加自定义游戏结束逻辑 gameSession.GameOver(); // 保留原销毁逻辑 Destroy(gameObject); } } }
该方案缺陷:
- 存在大量重复代码,后续基类如果修改
DestroyByTime的逻辑(比如加暂停判断、调整时间扣减规则),子类不会同步更新,极易出现逻辑不一致的bug - 对基类字段的访问权限有要求,适配性差
内容的提问来源于stack exchange,提问作者Meidziak65
相关产品推荐
相关产品推荐

