我正在尝试使用动画树中的 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
状态
我已经尝试了所有我能想到的方法,但还是一无所获。任何帮助将不胜感激。
解决方案:Dash状态下Blend参数设置错误。我将其设置为与“移动”状态的“混合”参数相同并且它起作用了。