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

Godot 4.0:如何在GDScript中用AnimationTree实现角色方向动画

实现CharacterBody2D的动画控制方案

第一步:节点结构准备

在你的CharacterBody2D节点下添加以下子节点:

  • Sprite2D:用于显示角色纹理(如果用序列帧动画,也可替换为AnimatedSprite2D,结合AnimationTree更推荐用Sprite2D配合AnimationPlayer)
  • AnimationPlayer:存放角色的所有动画片段(比如idle、run、jump)
  • AnimationTree:用于管理动画状态切换逻辑

第二步:配置AnimationTree

  1. 打开AnimationTree编辑器,在Tree Root选项中选择AnimationNodeStateMachine
  2. 点击面板上的Create New Library,命名为default
  3. 在状态机中添加三个AnimationNodeAnimation节点,分别关联AnimationPlayer里已创建的idle、run、jump动画
  4. 添加控制参数:在AnimationTree的Parameters面板,新增以下参数:
    • speed(float类型):控制跑步动画的播放速度比例
    • direction(float类型):记录角色移动方向(-1为左,1为右)
    • is_jumping(bool类型):标记角色是否处于跳跃状态
  5. 设置状态切换规则:
    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:52:48