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

Unity单组件多Update函数问题:子类Duck的Update未执行

问题原因

Player类中的Update方法是private修饰符,C#里私有方法无法被子类重写。Duck类里的Update只是一个独立的私有方法,Unity的MonoBehaviour生命周期系统只会调用继承链中最顶层的Update(也就是Player类中的那个),所以Duck的Update不会被执行。

解决方法

1. 修改Player类的Update为protected virtual

将Player中的Update改为受保护的虚方法,允许子类重写:

public class Player : MonoBehaviour
{
    private void Start()
    {
        Assign();
    }
    // 改为protected virtual,开放子类重写权限
    protected virtual void Update()
    {
        Input();
    }
    // ...其他代码
}

2. 在Duck类中重写Update并按需调用父类逻辑

用protected override重写Update方法,如果需要保留Player的Update逻辑,记得调用base.Update():

public class Duck : Player
{
    public float duckFlyForce;
    // 重写父类的Update方法
    protected override void Update()
    {
        // 先执行Player类的Update逻辑(可选,根据需求决定是否保留)
        base.Update();
        // 执行Duck自身的Fly逻辑
        Fly();
    }
  
    void Fly()
    { 
        if (Input.GetButtonDown("Jump") && !gC.isGround)
        {
             playerRB.velocity = Vector2.up * duckFlyForce;
        }
    }
}

补充说明

输入检测放在Update里是正确的,Input.GetButtonDown这类输入事件仅在触发帧有效,FixedUpdate调用间隔不固定,确实会导致输入丢失。如果不需要保留Player的Update逻辑,直接去掉base.Update()即可,只保留Duck自身的代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:32:41