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

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()

错误原因

  1. 调用对象错误:get_frame()(Godot 4中Sprite2D的方法,旧版本get_sprite_frame()已废弃)是Sprite2D节点的方法,而非AnimationPlayer的方法。你错误地向AnimationPlayer节点调用了属于精灵节点的函数,因此报错。
  2. 代码语法错误:
    • get_tree().get_nodes_in_group("Mannequin Clothes")未将结果赋值给变量,代码完全无效。
    • AnimationPlayer.play()方法无返回值,不能用if语句判断执行结果。
    • match语句语法错误,match后应接匹配表达式,用case定义分支,而非var current_base_frame:的写法。
  3. 节点路径问题:节点查找失败大概率是路径输入错误,或是节点未正确添加到场景中。

正确的帧同步方法

针对你的需求,有两种简单可靠的同步方式:

方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:13:28