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

Godot中如何让AnimatedSprite在按键触发时仅单次播放动画不循环

Godot AnimatedSprite 单次按键触发单次完整动画实现方案

核心逻辑

  • 使用按键刚按下的事件替代持续按住检测,避免每帧重复触发
  • 新增播放状态锁,动画播放过程中不会响应新的触发请求
  • 绑定动画播放完成信号,播放结束后自动重置状态

前置配置

打开AnimatedSprite的动画配置,将需要播放的目标动画的Loop属性设置为关闭,否则动画会无限循环,无法触发播放完成回调。

代码实现

Godot 4.x 示例

extends Node2D

# 替换为你项目中AnimatedSprite2D节点的实际路径
@onready var animated_sprite = $AnimatedSprite2D
# 播放状态锁,避免重复触发
var is_anim_playing: bool = false

func _ready():
    # 绑定动画播放完成信号
    animated_sprite.animation_finished.connect(_on_anim_finished)

func _process(delta: float) -> void:
    # 仅在按键刚按下、且无动画正在播放时触发
    # 如果你没有配置输入映射,可以替换为 Input.is_key_just_pressed(KEY_SPACE)
    if Input.is_action_just_pressed("attack") and not is_anim_playing:
        # 替换为你的动画名称
        animated_sprite.play("attack_anim")
        is_anim_playing = true

func _on_anim_finished():
    # 动画播放完成后解锁状态
    is_anim_playing = false
    # 如需播放完成后回到待机动画,取消注释下行即可
    # animated_sprite.play("idle")

Godot 3.x 示例

extends Node2D

onready var animated_sprite = $AnimatedSprite
var is_anim_playing = false

func _ready():
    animated_sprite.connect("animation_finished", self, "_on_anim_finished")

func _process(delta):
    if Input.is_action_just_pressed("attack") and not is_anim_playing:
        animated_sprite.play("attack_anim")
        is_anim_playing = true

func _on_anim_finished():
    is_anim_playing = false

常见问题排查

  • 如果动画还是重复触发:检查是否使用了is_action_pressed而非is_action_just_pressed,前者按住按键时每帧都会返回true
  • 如果动画播放完不停止:检查目标动画的Loop属性是否已经关闭
  • 如果不需要严格的不可打断逻辑,可以去掉状态锁变量,仅靠is_action_just_pressed也能避免按住重复触发,但快速连续按键会打断正在播放的动画重新播放

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:06:04