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

如何在Ursina引擎中实现Bunny Hop(兔子跳)机制?

如何在Ursina引擎中实现Bunny Hop(兔子跳)机制?

嘿,我来帮你搞定Ursina里的兔子跳机制!这玩意儿在FPS游戏里超带感,咱们一步步实现你要的功能——按住空格持续跳跃、按W时每次跳跃叠加速度,还额外给你加上可选的 Strafing(左右横移)加速逻辑:

核心思路拆解

  • 取消默认的「落地才能跳」限制,改成按住空格就触发跳跃动作
  • 每次跳跃时,如果按住W,就给角色叠加向前的速度
  • 可选优化:按住A/D横移时,同步叠加侧向速度,模拟真实Bunny Hop的 Strafing 加速效果

完整代码实现

咱们直接基于Ursina的FirstPersonController来修改,这样能省掉很多基础的移动逻辑:

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

class BunnyHopController(FirstPersonController):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 自定义参数,可根据手感调整
        self.jump_force = 8  # 跳跃高度
        self.speed_increment = 0.5  # 每次跳跃的速度增量
        self.strafe_increment = 0.3  # 横移加速的增量
        self.max_speed = 30  # 最大速度限制,防止速度无限叠加

    def update(self):
        super().update()  # 保留原有的视角、基础移动逻辑

        # 处理按住空格持续跳跃
        if held_keys['space']:
            # 给角色向上的力,实现跳跃
            self.y_velocity = self.jump_force
            self.position.y += self.y_velocity * time.dt

            # 按W时,叠加向前速度
            if held_keys['w']:
                forward_dir = self.forward * self.speed_increment
                self.velocity += forward_dir
                # 限制最大速度
                if self.velocity.length() > self.max_speed:
                    self.velocity = self.velocity.normalized() * self.max_speed

            # 可选:Strafing横移加速(按住A/D时生效)
            if held_keys['a']:
                left_dir = self.left * self.strafe_increment
                self.velocity += left_dir
                if self.velocity.length() > self.max_speed:
                    self.velocity = self.velocity.normalized() * self.max_speed
            if held_keys['d']:
                right_dir = self.right * self.strafe_increment
                self.velocity += right_dir
                if self.velocity.length() > self.max_speed:
                    self.velocity = self.velocity.normalized() * self.max_speed

        # 让角色始终保持移动惯性(默认FirstPersonController松开W会减速,这里改成保留惯性)
        # 如果需要松开W后慢慢减速,可以把下面的注释打开,调整drag值
        # self.velocity *= 0.98

app = Ursina()

# 创建场景
Ground(scale=64, texture='grass', texture_scale=(4,4))
Sky()

# 生成自定义的兔子跳控制器
player = BunnyHopController()

app.run()

关键细节说明

  • 持续跳跃逻辑:通过检测held_keys['space'],每次update都给角色向上的y_velocity,实现按住空格一直跳的效果
  • W键加速:每次跳跃时,把速度向量向角色当前视角的前方叠加,同时加了max_speed防止速度无限飙升
  • Strafing加速:同理,按住A/D时向左右方向叠加速度,模拟真实Bunny Hop里通过横移提速的技巧
  • 惯性保留:默认代码里去掉了减速逻辑,角色会一直保持速度;如果想要更贴近真实物理的减速效果,可以打开self.velocity *= 0.98这行注释,调整数值控制减速快慢

你可以根据自己的手感调整jump_force、speed_increment这些参数,比如把jump_force调小一点会更贴近CS里的兔子跳手感~

备注:内容来源于stack exchange,提问作者Вадим Малютин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 07:35:30