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
相关产品推荐
相关产品推荐

