Godot AnimationTree(动画树)
在开始之前,必须明确AnimationTree节点不包含它自己的动画。相反,它使用包含在AnimationPlayer节点中的动画。通过这种方式,你可以编辑你的动画(或者从3D场景中导入它们),然后使用这个额外的节点来控制播放。
创建动画树
Tree Root类型介绍:
- AnimationNodeAnimation: 从列表中选择一个动画并播放它。这是最简单的根节点,通常不直接用作根。
- AnimationNodeBlendTree: 包含许多混合类型节点,如mix, blend2, blend3, one shot等。这是最常用的Tree Root之一。
- AnimationNodeStateMachine: 在图中包含多个根节点作为子节点。 每个节点作为一个状态使用,并提供多种函数以在状态之间切换。
- AnimationNodeBlendSpace2D: 允许将根节点放置在2D混合空间中。 控制2D中的混合位置以在多个动画之间混合。-
- AnimationNodeBlendSpace1D: 上述的简化版本 (一维).
AnimationNodeBlendTree
Animation
OneShot
TimeScale
此图片未能显示实际效果,实际上动画变得更快。
BlendTree
可以说是AnimationNodeBlendTree中的AnimationNodeBlendTree。
Transition
非常简单的状态机(当您不想处理StateMachine节点时)。 可以将动画连接到输出,并可以指定过渡时间。
StateMachine
用代码控制
构建完树并对其进行预览之后,剩下的唯一问题是“如何通过代码控制所有这些?”。
请记住,动画节点只是资源,因此,它们在所有实例之间共享。 在节点中直接设置值将影响使用此AnimationTree的场景的所有实例。 但是,这有一些很酷的用例,例如 您可以复制和粘贴动画树的一部分,或在不同的动画树中重复使用具有复杂布局的节点(例如状态机或混合空间)。
实际的动画数据包含在AnimationTree节点中,并可以通过属性进行访问。 检查AnimationTree节点的“Parameters”部分,以查看可以实时修改的所有参数:
这很方便,因为它可以从AnimationPlayer甚至AnimationTree本身对它们进行动画处理,从而可以实现非常复杂的动画逻辑。
要从代码中修改这些值,必须获取属性路径。 通过将鼠标悬停在任何参数上,可以轻松完成此操作:
允许设置或读取它们:
anim_tree.set("parameters/eye_blend/blend_amount", 1.0)
# Simpler alternative form:
anim_tree["parameters/eye_blend/blend_amount"] = 1.0
状态机旅行
Godot的StateMachine实现中的一个不错的功能之一就是旅行的能力。 可以指示该图从当前状态转到另一状态,同时访问所有中间状态。 这是通过A *算法完成的。
要使用旅行功能,您应该首先从AnimationTree节点检索AnimationNodeStateMachinePlayback对象(该对象作为属性导出)。
var state_machine = anim_tree["parameters/StateMachine/playback"]
一旦检索到它,就可以通过调用它提供的众多函数中的一个来使用它:
state_machine.travel("SomeState")