如何在Godot的GDScript中动态修改动画关键帧的数值
动态修改动画关键帧坐标的实现方案
方案1:直接修改动画资源的关键帧数值
- 首先确认你要修改的动画名称,以及AnimationPlayer节点的路径
- 实例化动画场景时,先从玩家的Spatial节点拿到目标x、z坐标,再遍历动画的位移轨道关键帧,替换x、z数值
Godot 3.x 代码示例
# 脚本挂载在动画所在场景的根节点 onready var anim_player = $AnimationPlayer # 外部实例化时调用该方法传入从玩家节点获取的x、z值 func init_anim_pos(target_x: float, target_z: float) -> void: var anim = anim_player.get_animation("y_translate") # 替换为你的动画名 # 查找translation属性对应的轨道编号 var track_idx = anim.find_track("Spatial:translation", ANIMATION_TRACK_TYPE_VALUE) if track_idx < 0: return # 遍历所有关键帧替换x、z值,保留原有y值 for key_idx in range(anim.track_get_key_count(track_idx)): var pos = anim.track_get_key_value(track_idx, key_idx) pos.x = target_x pos.z = target_z anim.track_set_key_value(track_idx, key_idx, pos) # 播放修改后的动画 anim_player.play("y_translate")
Godot 4.x 代码示例
# 脚本挂载在动画所在场景的根节点 @onready var anim_player: AnimationPlayer = $AnimationPlayer func init_anim_pos(target_x: float, target_z: float) -> void: var anim = anim_player.get_animation("y_translate") # 替换为你的动画名 var track_idx = anim.find_track("position", Animation.TYPE_VALUE) if track_idx < 0: return for key_idx in range(anim.track_get_key_count(track_idx)): var pos = anim.track_get_key_value(track_idx, key_idx) pos.x = target_x pos.z = target_z anim.track_set_key_value(track_idx, key_idx, pos) anim_player.play("y_translate")
注意:如果你的动画资源是多实例共享的,修改前需要先复制资源避免影响其他实例:
var anim = anim_player.get_animation("y_translate").duplicate()
方案2:更推荐的无侵入实现(无需修改关键帧)
该方案不会改动原动画资源,多实例同时播放也不会出现冲突:
- 调整动画场景的节点结构:新增一个空Spatial/Node3D作为根节点,原本做位移动画的节点作为它的子节点
- 调整原有动画:仅控制子节点的y轴数值从-5到5,不设置x、z的关键帧
- 实例化动画场景时,直接给根节点设置
translation(3.x)/position(4.x)的x、z为你从玩家节点拿到的数值即可,设置完成后直接播放动画就行
内容的提问来源于stack exchange,提问作者Spiro Cromwell
相关产品推荐
相关产品推荐

