书接上文:《Godot Engine:街霸隆的动画(Idle/波动拳/升龙拳)导入步骤以及运行时的简单动画切换》,我们已经完成了Idle/波动拳/升龙拳动画的导入与加载,甚至还写了动画简单切换的代码
效果图
文章目录
为什么要使用动画状态机
- 效果图
- 为什么要使用动画状态机
- Godot Engine动画状态机基本使用方法
- 添加动画状态机节点
- 构造动画状态机
- 控制代码
- 测试运行
我们已经可以使用代码切换动画了,为什么还要使用状态机?
如果大家尝试实现了上篇文章的内容,并尝试运行了一下,不难发现“简单”的切换存在很多问题,比如:
- 升龙拳落地以后并不能自动切换回Idle状态
- 一个必杀技过程中,如果用户继续触发必杀技,那么当前必杀技执行途中就会开始新的必杀技
- 动画之间的过渡很生硬,直接停止当前动画并开始新动画,没有任何动画融合
我们希望有一个机制能够帮我们处理这些动画状态跳转问题,这个机制就是动画状态机。
Godot Engine动画状态机基本使用方法见《Godot动画系统:动画状态机-AnimationTree(AnimationNodeStateMachine模式)基本设置与界面》
添加动画状态机节点Godot Engine添加状态机节点的位置非常灵活,本例中我们在 “Ryu.tscn” 场景中添加一个AnimationTree
节点
如下图所示,设置
AnimationTree
:
Tree Root
实际上是它的工作模式,本例中让它充当动画状态机State Machine
Anim Player
是设置它获取动画的容器,也就是Animation Player
Active
勾选以后,意味着将Animation Player
的控制权交给AnimationTree
动画之间的状态转移根据实际情况设定,如上文所述:隆在升龙拳的时候不可能直接切换到波动拳,所以,类似的状态之间就不要添加过渡线。
过渡线的切换模式(Switch Mode)有三种:
Immediate
:立即切换,当前动画的尾部会和新动画的头部融合Sync
:立即切换,新动画的起始位置是旧动画的结束位置
老王的理解:比如旧动画有10帧,新动画100帧,切换到新动画以后是从新动画的第10帧开始播放
AtEnd
:当前动画播放完毕再切换到新动画
波动拳和升龙拳到Idle的过渡切换模式都是
AtEnd
,其余都是Immediate
并且,波动拳和升龙拳到Idle的过渡都是当动画结束后无须任何条件自动切换的,因此这2个过渡要勾选Auto Advance
选项。
这段代码放到Ryu.tscn场景的根节点上
#Ryu
extends Spatial
var playback : AnimationNodeStateMachinePlayback
func _ready():
playback = $AnimationTree.get("parameters/playback")
playback.start("Idle@Ryu")
func _process(delta):
if Input.is_action_just_pressed("ui_j"):
playback.travel("Hadoken@Ryu")
if Input.is_action_just_pressed("ui_k"):
playback.travel("Syoryuken@Ryu")
测试运行