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

切换输入方向时BlendSpace2D动画不更新问题求助

2D角色冲刺状态下BlendSpace2D动画不更新问题

我正在用Godot的Animation Tree中的BlendSpace2D制作2D角色动画,搭建了基础状态机:当检测到charge输入且移动方向不为(0,0)时,切换至DASH状态;松开charge按钮后切回普通状态。但在DASH状态下切换方向时,动画不会更新——比如向左冲刺时改为向右移动,动画仍保持向左,导致角色反向移动。非DASH状态下,普通移动的BlendSpace2D动画更新正常。

以下是玩家角色的管理代码:

extends CharacterBody2D
class_name Player

@export var ACCELERATION = 17
@export var MAX_SPEED = 100
@export var FRICTION = 100
@export var DASH_SPEED = MAX_SPEED * 1.5
var direction = Vector2.ZERO
enum{
    MOVE,
    DASH,
    CHARGE,
    ATTACK
}
var state = MOVE


@onready var animation_player = $AnimationPlayer
@onready var animation_tree = $AnimationTree
@onready var animation_state = animation_tree.get("parameters/playback")
@onready var sprite_2d = $Sprite2D

var anim_dir = Vector2.ZERO 
 
func _ready():
    animation_tree.active = true

func _process(_delta):
    direction = Vector2.ZERO

    anim_dir.x = Input.get_axis("move_left", "move_right")
    
    anim_dir.y = Input.get_axis("move_up", "move_down")
    direction = anim_dir.normalized()
    

func _physics_process(delta):
    match state:
        MOVE:
            move_state(delta)
        DASH:
            dash_state(delta)
        CHARGE: 
            charge_state(delta)
        ATTACK:
            attack_state(delta)
            
func move_state(delta):
    if direction.length()!= 0:
        if anim_dir.x !=0:
            set_animation_parameters()

        velocity = velocity.move_toward(direction * MAX_SPEED, ACCELERATION)
        move_and_slide()
        animation_state.travel("Move")
        if Input.is_action_just_pressed("charge"):
            state = DASH
    else:
        velocity = velocity.move_toward(Vector2.ZERO, FRICTION) 
        if Input.is_action_just_pressed("charge"):
            state = CHARGE
        animation_state.travel("Idle")

func set_animation_parameters():
    animation_tree.set("parameters/Idle/blend_position", anim_dir)
    animation_tree.set("parameters/Move/blend_position", anim_dir)
    animation_tree.set("parameters/Dash/blend_position", anim_dir)
    
func dash_state(delta):
    if direction.length()>0:
        if anim_dir.x != 0:
            set_animation_parameters()
        velocity = velocity.move_toward(direction * DASH_SPEED, ACCELERATION)
        move_and_slide()
        animation_state.travel("Dash")
    if Input.is_action_just_released("charge"):
        state=MOVE
        
func attack_state(delta):
    pass
func charge_state(delta):
    print("charging...")
    if Input.is_action_just_released("charge"):
        state = MOVE

我在移动和冲刺状态下都调用了set_animation_parameters()方法,且通过animation_state.travel()切换动画状态的逻辑完全一致,但只有普通移动状态下动画能正常更新。已排除Move动画被Idle打断的可能——垂直方向切换方向不会触发Idle,动画仍能正常更新。

动画相关设置说明

  • 动画树结构:包含Idle、Move、Dash三个BlendSpace2D节点,通过状态机进行状态切换
  • Move的BlendSpace2D:左侧绑定左移动画,右侧绑定右移动画
  • Dash的BlendSpace2D:与Move设置完全一致,左右分别绑定左冲刺、右冲刺动画

尝试了多种方法仍未解决问题,恳请帮助。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:12:35