Godot Engine:街霸隆的动画状态机(Animation State Machine)

书接上文:《Godot Engine:街霸隆的动画(Idle/波动拳/升龙拳)导入步骤以及运行时的简单动画切换》,我们已经完成了Idle/波动拳/升龙拳动画的导入与加载,甚至还写了动画简单切换的代码

效果图

在这里插入图片描述

为什么要使用动画状态机

我们已经可以使用代码切换动画了,为什么还要使用状态机?

如果大家尝试实现了上篇文章的内容,并尝试运行了一下,不难发现“简单”的切换存在很多问题,比如:

  • 升龙拳落地以后并不能自动切换回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")

测试运行

在这里插入图片描述

©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页