输入方向更改时,Blendspace 2D 不更新

问题描述 投票:0回答:1

我正在尝试使用动画树中的 Blendspace2D 来制作 2D 角色的动画。我构建了一个基本状态机,当检测到

charge
输入而方向移动不是
(0, 0)
时,状态更改为
DASH
状态并保持在那里,直到释放
charge
按钮,动画状态更改为
Dash
动画 Blendspace2D。但是,在
DASH
状态下,如果我改变方向,动画不会更新,例如,如果我向左冲刺,然后在冲刺时向右移动,动画不会改变,因此角色会向后移动。虽然 not 处于
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
#@onready var animation_state = animation_tree.get("parameters/playback")
#var direction_changed = false

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

如您所见,我在移动和冲刺时为每个状态设置了动画参数,并以相同的方式让

animation_state
移动到
Dash
Move
,但后者有效而前者无效。据我所知,这并不是因为
Move
动画状态被
Idle
动画状态中断,因为我可以通过垂直按住输入来更改方向,而无需重置为
Idle
动画,并且它仍然有效。

这是我的动画树设置:

这是

Move
状态的blendspace2D,其中左侧的每个点都是向左移动的动画,右侧的每个点都是向右移动的动画

这是

Dash
状态,其设置与
Move
状态

我已经尝试了所有我能想到的方法,但还是一无所获。任何帮助将不胜感激。

animation 2d godot gdscript godot4
1个回答
0
投票

解决方案:Dash状态下Blend参数设置错误。我将其设置为与“移动”状态的“混合”参数相同并且它起作用了。

© www.soinside.com 2019 - 2024. All rights reserved.