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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:27:17