切换输入方向时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
相关产品推荐
相关产品推荐

