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

Ursina中重写FirstPersonController的update导致玩家控制失效的解决办法

Ursina重写FirstPersonController的update后玩家控制失效的解决办法

问题根源很直白:FirstPersonController的update方法本身就包含了玩家移动、鼠标视角控制的全部逻辑。当你重写这个方法却没调用父类的update时,等于把原本的控制代码完全替换掉——哪怕是空的update,也会让父类的控制逻辑彻底失效。

解决方法也直接:在你自定义的update方法里,必须调用父类的update方法,让原本的控制逻辑正常运行,再加上你的回血逻辑即可。

示例代码:

from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
import time

class Player(FirstPersonController):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.health = 100  # 初始化生命值

    def update(self):
        # 先调用父类的update,保证行走、视角控制正常
        super().update()
        
        # 你的回血逻辑:生命值未满且无危险时回血
        if self.health < 100:
            # 这里可以添加危险检测的判断,比如检测附近是否有敌人
            self.health += 0.1 * time.dt
            self.health = min(self.health, 100)  # 防止生命值超过上限

if __name__ == '__main__':
    app = Ursina()
    Player()
    Sky()
    app.run()

如果不想重写update,也可以用Ursina自带的repeat方法实现定时回血,完全不影响父类的控制逻辑:

from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController

class Player(FirstPersonController):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.health = 100
        # 每隔0.1秒执行一次回血方法,循环运行
        self.repeat(self.regenerate_health, delay=0.1)

    def regenerate_health(self):
        if self.health < 100:
            # 这里添加危险检测逻辑
            self.health += 1
            self.health = min(self.health, 100)

if __name__ == '__main__':
    app = Ursina()
    Player()
    Sky()
    app.run()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:00:08