Godot 4.0:如何在GDScript中用AnimationTree实现角色方向动画
实现CharacterBody2D的动画控制方案
第一步:节点结构准备
在你的CharacterBody2D节点下添加以下子节点:
Sprite2D:用于显示角色纹理(如果用序列帧动画,也可替换为AnimatedSprite2D,结合AnimationTree更推荐用Sprite2D配合AnimationPlayer)AnimationPlayer:存放角色的所有动画片段(比如idle、run、jump)AnimationTree:用于管理动画状态切换逻辑
第二步:配置AnimationTree
- 打开
AnimationTree编辑器,在Tree Root选项中选择AnimationNodeStateMachine - 点击面板上的
Create New Library,命名为default - 在状态机中添加三个
AnimationNodeAnimation节点,分别关联AnimationPlayer里已创建的idle、run、jump动画 - 添加控制参数:在
AnimationTree的Parameters面板,新增以下参数:speed(float类型):控制跑步动画的播放速度比例direction(float类型):记录角色移动方向(-1为左,1为右)is_jumping(bool类型):标记角色是否处于跳跃状态
- 设置状态切换规则:
idle→run:当speed > 0.1且is_jumping == false时触发run→idle:当speed < 0.1且is_jumping == false时触发- 地面状态→
jump:当is_jumping == true时触发 jump→idle:当is_jumping == false且speed < 0.1时触发jump→run:当is_jumping == false且speed > 0.1时触发
第三步:修改GDScript代码
在原有脚本基础上添加动画控制逻辑:
extends CharacterBody2D const SPEED = 300.0 const JUMP_VELOCITY = -400.0 var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") # 引用AnimationTree节点 @onready var animation_tree = $AnimationTree # 缓存参数对象,避免重复查找 @onready var animation_params = animation_tree.parameters func _physics_process(delta): # 重力处理 if not is_on_floor(): velocity.y += gravity * delta # 跳跃处理 if Input.is_action_just_pressed("ui_accept") and is_on_floor(): velocity.y = JUMP_VELOCITY # 移动方向与速度处理 var direction = Input.get_axis("left", "right") if direction: velocity.x = direction * SPEED else: velocity.x = move_toward(velocity.x, 0, SPEED) # -------------------------- # 动画控制逻辑 # -------------------------- # 更新移动速度参数(取绝对值,方向单独处理) animation_params["speed"] = abs(velocity.x) / SPEED # 更新方向参数 animation_params["direction"] = direction # 更新跳跃状态参数 animation_params["is_jumping"] = not is_on_floor() # 控制角色翻转(根据移动方向) if direction != 0: $Sprite2D.flip_h = direction < 0 move_and_slide()
额外注意事项
- 确保
AnimationPlayer中已创建对应命名的动画片段(idle、run、jump),且与AnimationTree的状态节点关联一致 - 若需要跑步动画随速度变化播放快慢,可在
AnimationNodeAnimation的Speed Scale选项中绑定speed参数 - 若使用
AnimatedSprite2D,可省略AnimationPlayer,直接在AnimationTree中用AnimationNodeFrameAnimation关联帧动画
内容的提问来源于stack exchange,提问作者Kaymush
相关产品推荐
相关产品推荐

