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
相关产品推荐
相关产品推荐

