同学们好!本节学习一下人物挥剑操作。
一、将鼠标左键单击设为输入映射
单击项目选择项目设置,在添加新动作填写sword,然后点击添加。在动作列表中,单击sword后面的加号,在弹出对话框中单击鼠标左键,最后单击确定,这样鼠标左键就完成了输入映射,过程如下:
二、添加挥剑代码
在walk_state最后添加如下代码:
if Input.is_action_just_pressed("sword"):velocity= Vector2.ZEROstate = SWORD
这段代码表示当按下鼠标左键的时候,人物状态进行SWORD状态。将sword_state()函数修改如下:
func sword_state():anima_tree["parameters/playback"].travel("Sword")
这段代码表示,当人物处于SWORD状态,就播放挥剑动画。当挥剑完成后,还需要人物状态进入WALK状态。有3种方法实现:
1.使用信号
在player节点下选择AnimationTree节点,在右侧检查器选项卡右侧单击节点,进入该节点的信号选择页面,找到 animation_finished(anim_name: StringName)信号双击,弹出连接信号到方法对话框,选择Player节点,单击连接。操作如下:
这样信号就连接到Player交办中了,如下图所示:
animation_finished(anim_name: StringName)信号表示动画播放结束时通知,注意:如果动画正在循环播放,则不会发出此信号。
我们在该方法下添加如下代码:
func _on_animation_tree_animation_finished(anim_name):state = WALK
2.利用定时器完成
该方法需要对修改sword_state()函数,代码如下:
func sword_state():anima_tree["parameters/playback"].travel("Sword")await get_tree().create_timer(.44).timeoutstate = WALK
await
关键字可以用来创建协程,会等待某个信号发出之后再继续执行下面的代码。对信号或者对同为协程的函数调用使用 await
关键字会立即将控制权返回给调用方。发出信号时(或者调用的协程完成时),就会从停止的地方继续往下执行代码。get_tree()表示返回包含该节点的Scenetree,如果节点不在场景内返回Null。create_timer表示创建一个定时器,会在 SceneTree 中经过给定秒数后发出 SceneTreeTimer.timeout 信号。所以上述代码表示0.44秒后,将state设为WALK。0.44秒正好动画播放完成。
3.在动画中调用函数将state设为WALK
第一步在代码中添加如下代码:
func swortowalk():state = WALK
第二步,选择AnimationPlayer节点,在动画面板中单击天轨道按钮。
在弹出的菜单中选择方法调用轨道。
在弹出对话框中选择Player节点。
这样会在动画控制面板中添加一个轨道,在这个轨道0.4秒处单击右键,选择插入关键帧。
在弹出的对话框,选择swordtowalk()函数。
这样,向右的挥剑动画,结束后就会调用swordtowalk()函数,这样人物状态就由SWORD变为了WALK。
同理,将向左、向上、向下挥剑动作全部如此处理,就完成了。
最终实现效果如下所示。
简单回顾一下本节,用了发送信号方法、定时器方法和动画调用脚本函数3种方法实现了人物的挥剑操作,这样人物移动就告一段落了。下一步将要学习,背景场景搭建。谢谢同学们的支持,有问题请留言。最后我把用到的代码拷到下面,有需要的同学请拿走。
extends CharacterBody2D
@onready var anima_tree=$AnimationTree
enum {WALK,SWORD
}
var state = WALK
const SPEED = 120.0
func _physics_process(delta):match state:WALK:walk_state()SWORD:sword_state()move_and_slide()
func walk_state():var direction = Vector2.ZEROdirection.x = Input.get_axis("left", "right")direction.y = Input.get_axis("up", "down")if direction:anima_tree.set("parameters/Idle/blend_position",direction)anima_tree.set("parameters/Walk/blend_position",direction)anima_tree.set("parameters/Sword/blend_position",direction)anima_tree["parameters/playback"].travel("Walk")velocity = direction * SPEEDelse:anima_tree["parameters/playback"].travel("Idle")velocity= Vector2.ZEROif Input.is_action_just_pressed("sword"):velocity= Vector2.ZEROstate = SWORD
func sword_state():anima_tree["parameters/playback"].travel("Sword")func _on_animation_tree_animation_finished(anim_name):state = WALK