在Godot 2D平台游戏中无法实现Coyote Time功能求助
Godot 2D平台游戏Coyote Time修复及代码优化
核心问题:Coyote Time未生效的原因
你的代码里Coyote Time逻辑存在几个关键错误:
was_on_floor仅在变量定义时赋值一次,不会随帧更新,导致永远无法触发离开地面后的判断- 计时器启动时机错误:应该在角色刚离开地面时启动,而不是在按下跳跃键时才启动
- 重复叠加重力:代码中两次执行
motion.y += GRAVITY,导致重力翻倍,角色下落过快 - 条件分支逻辑混乱,空中动画的设置被错误的else分支覆盖
修复后的完整代码
extends KinematicBody2D const UP = Vector2(0,-1) const GRAVITY = 9 const SPEED = 150 const JUMP_HEIGHT = -400 const COYOTE_DURATION = 0.15 # 调整这个值控制 Coyote Time 时长,0.15秒比较合理 var motion = Vector2() var coyote_timer: Timer var is_jumping = false var was_on_floor = false # 初始化为false,后续每帧更新 func _ready(): # 初始化计时器 coyote_timer = Timer.new() coyote_timer.one_shot = true coyote_timer.wait_time = COYOTE_DURATION add_child(coyote_timer) $AnimationTree.active = true func _physics_process(delta): # 更新上一帧的地面状态 was_on_floor = is_on_floor() # 应用重力(只加一次) motion.y += GRAVITY # 水平移动逻辑 if Input.is_action_pressed("move_right"): motion.x = SPEED $Sprite.flip_h = false $AnimationTree.set("parameters/state/current", 1) elif Input.is_action_pressed("move_left"): motion.x = -SPEED $Sprite.flip_h = true $AnimationTree.set("parameters/state/current", 1) else: motion.x = 0 $AnimationTree.set("parameters/state/current", 0) # Coyote Time 核心逻辑 # 当角色刚离开地面时启动计时器 if was_on_floor and not is_on_floor(): coyote_timer.start() # 跳跃判断:落地时允许跳,或者Coyote Time期间允许跳 if Input.is_action_just_pressed("jump") and not is_jumping: if is_on_floor() or coyote_timer.is_processing(): is_jumping = true motion.y = JUMP_HEIGHT # 落地时重置跳跃状态 if is_on_floor(): is_jumping = false coyote_timer.stop() # 落地立即停止计时器 # 空中动画逻辑 if not is_on_floor(): if motion.y < 0: $AnimationTree.set("parameters/state/current", 2) # 上升动画 else: $AnimationTree.set("parameters/state/current", 3) # 下落动画 # 移动角色 motion = move_and_slide(motion, UP)
其他代码优化点
- 给变量添加类型标注(如
var coyote_timer: Timer),方便Godot编辑器提示,减少错误 - 将Coyote时长设为单独常量
COYOTE_DURATION,更易调整参数 - 调整逻辑顺序:先更新地面状态,再处理移动、跳跃、动画,逻辑更清晰
- 移除冗余的
pass语句,_physics_process不需要空语句 - 落地时立即停止计时器,避免落地后还能触发Coyote跳跃
关键逻辑说明
was_on_floor更新:每帧开头把当前is_on_floor()的值赋给was_on_floor,这样才能检测到角色刚离开地面的瞬间- 计时器启动时机:当角色从落地状态变为空中状态时,启动Coyote计时器
- 跳跃触发条件:按下跳跃键时,只要角色在地面,或者计时器还在运行(Coyote Time窗口内),就允许跳跃
- 重力只加一次:避免角色下落速度异常
内容的提问来源于stack exchange,提问作者DevDev
相关产品推荐
相关产品推荐

