Ursina FirstPersonController按住Shift/Ctrl时无法跳跃问题求助
Ursina FirstPersonController 按住Shift/Ctrl时无法跳跃的解决方案
可能的原因
Ursina默认的FirstPersonController跳跃逻辑依赖input事件触发,部分场景下按住Shift/Ctrl时,空格键的输入检测可能存在优先级冲突,或是下蹲(Ctrl)导致碰撞盒变化,使grounded(是否在地面)判断异常。
解决方法
方法1:重写input方法强制处理跳跃
继承默认控制器,手动添加不受Shift/Ctrl影响的跳跃逻辑:
from ursina import * from ursina.prefabs.first_person_controller import FirstPersonController class CustomFPSController(FirstPersonController): def input(self, key): # 执行父类默认输入处理(含奔跑、下蹲逻辑) super().input(key) # 强制触发跳跃:按下空格且在地面时执行跳跃 if key == 'space' and self.grounded: self.y_velocity = self.jump_height self.grounded = False # 短暂延迟后恢复地面状态,防止空中连跳 invoke(setattr, self, 'grounded', True, delay=0.1) # 使用自定义控制器替代默认的FirstPersonController player = CustomFPSController()
方法2:在update循环中持续检测跳跃输入
若input事件检测存在冲突,可在每帧更新时直接检测按键状态:
class CustomFPSController(FirstPersonController): def update(self): super().update() # 每帧检测:按住空格且在地面时触发跳跃 if held_keys['space'] and self.grounded: self.y_velocity = self.jump_height self.grounded = False invoke(setattr, self, 'grounded', True, delay=0.1)
方法3:调整碰撞盒修正地面检测
如果是下蹲(Ctrl)导致碰撞盒偏移,使grounded误判,可修改碰撞盒参数:
class CustomFPSController(FirstPersonController): def __init__(self, **kwargs): super().__init__(**kwargs) # 调整碰撞盒位置与大小,避免下蹲时脱离地面检测范围 self.collider = BoxCollider(self, center=(0,0.5,0), size=(1,1,1)) def input(self, key): super().input(key) # 自定义跳跃逻辑(同方法1) if key == 'space' and self.grounded: self.y_velocity = self.jump_height self.grounded = False invoke(setattr, self, 'grounded', True, delay=0.1)
验证步骤
- 运行自定义控制器代码,测试按住Shift/Ctrl+空格是否能正常跳跃。
- 若问题仍存在,在
input或update方法中添加print(held_keys),确认空格键输入是否被正确捕获。
内容的提问来源于stack exchange,提问作者Alex Krakowiak
相关产品推荐
相关产品推荐

