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

如何在Godot的Animation Player中更换动画内的纹理

无需创建多个动画,复用现有持盘idle即可

  • 核心逻辑:只要你的持盘动画没有对餐盘的纹理属性设置关键帧,就可以直接在播放动画前/播放过程中切换纹理,动画会正常播放且不会覆盖你设置的纹理。

解决步骤:

  1. 检查动画轨道(关键)
    打开Animation Player的动画编辑器,找到餐盘节点对应的轨道。如果里面有「纹理」相关的关键帧,必须删除它们——这些关键帧会在动画播放时强制设置纹理,导致你手动切换的纹理被覆盖。只保留位置、旋转、缩放这类动画属性的关键帧即可。

  2. 代码切换纹理(以2D为例,3D类似)
    假设你的餐盘是一个Sprite2D节点,直接在需要切换的地方赋值新纹理,再播放动画:

    # 切换到肉盘
    $PlateSprite.texture = load("res://textures/meat_plate.png")
    $AnimationPlayer.play("hold_plate_idle")
    
    # 切换到素盘
    $PlateSprite.texture = load("res://textures/veggie_plate.png")
    $AnimationPlayer.play("hold_plate_idle")
    

    如果是3D场景(比如MeshInstance3D),需要修改材质的纹理:

    var plate_material = $PlateMesh.material_override as StandardMaterial3D
    # 切换肉盘纹理
    plate_material.albedo_texture = load("res://textures/meat_plate_3d.png")
    $AnimationPlayer.play("hold_plate_idle")
    
  3. 优化管理(可选)
    可以提前把纹理资源加载好,避免重复加载影响性能:

    # 脚本开头预加载纹理
    var meat_plate_tex = preload("res://textures/meat_plate.png")
    var veggie_plate_tex = preload("res://textures/veggie_plate.png")
    
    # 封装切换函数
    func switch_plate(is_meat: bool):
        $PlateSprite.texture = meat_plate_tex if is_meat else veggie_plate_tex
        # 如果动画已经在播放,不需要重新play,纹理会实时更新
        if not $AnimationPlayer.is_playing():
            $AnimationPlayer.play("hold_plate_idle")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:55:00