如何在Godot的Animation Player中更换动画内的纹理
无需创建多个动画,复用现有持盘idle即可
- 核心逻辑:只要你的持盘动画没有对餐盘的纹理属性设置关键帧,就可以直接在播放动画前/播放过程中切换纹理,动画会正常播放且不会覆盖你设置的纹理。
解决步骤:
检查动画轨道(关键)
打开Animation Player的动画编辑器,找到餐盘节点对应的轨道。如果里面有「纹理」相关的关键帧,必须删除它们——这些关键帧会在动画播放时强制设置纹理,导致你手动切换的纹理被覆盖。只保留位置、旋转、缩放这类动画属性的关键帧即可。代码切换纹理(以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")优化管理(可选)
可以提前把纹理资源加载好,避免重复加载影响性能:# 脚本开头预加载纹理 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
相关产品推荐
相关产品推荐

