Godot 4.2中同步动画帧失败,AnimationPlayer函数调用报错求助
Godot 4.2中AnimationPlayer帧同步问题解答
问题描述
使用Godot 4.2的GDScript开发2D模拟经营游戏,玩家可设计售卖服饰。当前制作模特T恤动画时,将基础图与线条图设为独立精灵,需要单独修改基础颜色。设置了两个AnimationPlayer分别控制基础图和线条图的动画,每个动画包含6帧对应不同尺寸,需要同步两者的帧,但调用get_sprite_frame()、get_frame()等函数时,提示AnimationPlayer不存在这些函数,同时存在节点查找问题。当前代码如下:
func MatchLineBase_Value(): get_tree().get_nodes_in_group("Mannequin Clothes") var current_line_frame = $Top_Base/Top_Line/Top_Line_Ani.get_sprite_frame() if $Top_Base/Top_Base_Ani.play("TShirt_Base"): match current_line_frame: var current_base_frame: $Top_Base/Top_Base_Ani.get_sprite_frame()
错误原因
- 调用对象错误:
get_frame()(Godot 4中Sprite2D的方法,旧版本get_sprite_frame()已废弃)是Sprite2D节点的方法,而非AnimationPlayer的方法。你错误地向AnimationPlayer节点调用了属于精灵节点的函数,因此报错。 - 代码语法错误:
get_tree().get_nodes_in_group("Mannequin Clothes")未将结果赋值给变量,代码完全无效。AnimationPlayer.play()方法无返回值,不能用if语句判断执行结果。match语句语法错误,match后应接匹配表达式,用case定义分支,而非var current_base_frame:的写法。
- 节点路径问题:节点查找失败大概率是路径输入错误,或是节点未正确添加到场景中。
正确的帧同步方法
针对你的需求,有两种简单可靠的同步方式:
方法1:同步AnimationPlayer的播放进度
如果两个动画的时长、帧速率完全一致,直接让基础图的AnimationPlayer跟上线条图的播放进度即可:
func sync_animations(): # 获取线条动画的AnimationPlayer节点 var line_ani = $Top_Base/Top_Line/Top_Line_Ani # 获取基础动画的AnimationPlayer节点 var base_ani = $Top_Base/Top_Base_Ani # 启动对应动画 line_ani.play("TShirt_Line") base_ani.play("TShirt_Base") # 同步播放进度 base_ani.seek(line_ani.current_animation_position, true)
如果需要实时同步(动画播放过程中始终保持帧一致),可以监听AnimationPlayer的animation_updated信号:
func _ready(): var line_ani = $Top_Base/Top_Line/Top_Line_Ani var base_ani = $Top_Base/Top_Base_Ani # 监听线条动画更新,实时同步基础动画进度 line_ani.animation_updated.connect(func(): base_ani.seek(line_ani.current_animation_position, true) ) # 启动动画 line_ani.play("TShirt_Line") base_ani.play("TShirt_Base")
方法2:直接同步Sprite2D的帧
如果动画只是单纯切换Sprite2D的帧,可以直接获取线条精灵的当前帧,赋值给基础精灵:
func sync_sprite_frames(): # 获取线条的Sprite2D节点(注意:不是AnimationPlayer) var line_sprite = $Top_Base/Top_Line/Sprite2D # 获取基础的Sprite2D节点 var base_sprite = $Top_Base/Sprite2D # 同步当前帧 base_sprite.frame = line_sprite.frame # 实时同步:监听线条精灵的帧变化信号 line_sprite.frame_changed.connect(func(): base_sprite.frame = line_sprite.frame )
额外注意事项
- 节点路径可以在编辑器中右键节点,选择「复制节点路径」获取,避免手动输入错误。
- Godot 4中Sprite2D的帧操作可直接访问
frame属性,或使用get_frame()/set_frame()方法,旧的get_sprite_frame()已被移除。 - 若两个动画参数完全一致,方法1的进度同步更省心;若动画逻辑不同,方法2直接同步精灵帧更准确。
内容的提问来源于stack exchange,提问作者StinkyGuyJeff
相关产品推荐
相关产品推荐

