AnimationTree

介绍

AnimationPlayer Godot有一个最灵活的动画系统,你可以在任何游戏引擎找到。在任何节点或资源中动画几乎任何属性的能力,以及有专门的转换、Bezier、函数调用、音频和子动画轨迹的能力,是非常独特的。

但是,支持通过 AnimationPlayer 是相对有限的,因为只有一个固定的交叉褪色过渡时间可以设置。

AnimationTree 是Godot3.1中引入的一个新节点,用于处理高级转换。它取代了古代 AnimationTreePlayer 同时增加了大量的功能和灵活性。

创建动画树

在开始之前,必须明确 AnimationTree 节点不包含自己的动画。相反,它使用包含在 AnimationPlayer 节点。这样,您可以像往常一样编辑动画(或从3D场景导入动画),然后使用这个额外的节点控制播放。

最常用的使用方法 AnimationTree 在三维场景中。从3D交换格式导入场景时,通常会附带内置动画(多个动画或在导入时从大型动画中拆分)。最后,导入的Godot场景将包含 AnimationPlayer 节点。

由于很少直接在godot中使用导入的场景(它们要么是实例化的,要么是继承的),因此可以将 AnimationTree 新场景中包含导入的节点。然后,指出 AnimationTree 节点到 AnimationPlayer 在导入的场景中创建的。

这就是在 Third Person Shooter demo ,供参考:

../../_images/animtree1.png

为玩家创建了一个新的场景 KinematicBody 作为根。在这个场景里,原始的 .dae (collada)文件被实例化,并且 AnimationTree 节点已创建。

创建树

有三种主要类型的节点可用于 AnimationTree

  1. 动画节点,它引用链接的动画 AnimationTree .

  2. 动画根节点,用于混合子节点。

  3. 动画混合节点,用于 AnimationNodeBlendTree 通过多个输入端口进行单图混合。

在中设置根节点 AnimationTree ,有几种类型:

../../_images/animtree2.png
  • AnimationNodeAnimation :从列表中选择动画并播放。这是最简单的根节点,通常不直接用作根节点。

  • AnimationNodeBlendTree :包含多个 混合 类型节点,如mix、blend2、blend3、one-shot等。这是最常用的根之一。

  • AnimationNodeStateMachine :包含多个根节点作为图中的子节点。每个节点用作 状态 ,并提供多个函数在状态之间切换。

  • AnimationNodeBlendSpace2D :允许在二维混合空间中放置根节点。在二维中控制混合位置以在多个动画之间混合。

  • AnimationNodeBlendSpace1D :上述(1d)的简化版本。

混合树

AnimationNodeBlendTree 可以包含用于混合的根节点和常规节点。节点从菜单添加到图形中:

../../_images/animtree3.png

所有混合树都包含 Output 默认情况下,节点和一些东西必须连接到它才能播放动画。

测试此功能的最简单方法是连接 Animation 直接指向它的节点:

../../_images/animtree4.png

这将简单地回放动画。确保 AnimationTree 对实际发生的事情是积极的。

以下是可用节点的简短描述:

布兰德2/布兰德3

这些节点将由用户指定的混合值在两个或三个输入之间混合:

../../_images/animtree5.gif

对于更复杂的混合,建议使用混合空间。

混合也可以使用过滤器,也就是说,您可以单独控制通过混合功能的轨迹。这对于将动画层叠在一起非常有用。

../../_images/animtree6.png

OneShot

此节点将执行子动画,并在完成后返回。可以自定义淡入淡出的混合时间以及过滤器。

../../_images/animtree6b.gif

寻找

此节点可用于使图的任何子代发生SEEK命令。设置时间后,此值返回到-1。

TimeScale

允许在任何子节点中缩放动画的速度(或反转动画)。将其设置为0将暂停动画。

过渡

非常简单的状态机(当你不想处理 StateMachine 节点)。动画可以连接到输出,并且可以指定转换时间。

混合空间2d

BlendSpace2D 是在二维中进行高级混合的节点。将点添加到二维空间中,然后可以控制位置以确定混合:

../../_images/animtree7.gif

可以控制x和y的范围(为了方便标记)。默认情况下,点可以放置在任何位置(只需右键单击坐标系或使用 添加点 按钮)和三角形将使用Delaunay自动生成。

../../_images/animtree8.gif

也可以通过禁用 自动三角形 选项,尽管很少需要:

../../_images/animtree9.png

最后,可以更改混合模式。默认情况下,混合通过在最近三角形内插入点来进行。处理二维动画(逐帧)时,您可能希望切换到 离散的 模式。或者,如果要在离散动画之间切换时保持当前播放位置,则 携带 模式。此模式可以在 混合 菜单:

../../_images/animtree10.png

混合空间1d

这类似于二维混合空间,但在一维空间中(因此不需要三角形)。

StateMachine

这个节点是一个相对简单的状态机。根节点可以通过线创建和连接。状态通过连接 过渡 ,这是具有特殊属性的连接。转换是单向的,但两个转换可以用两种方式连接。

../../_images/animtree11.gif

有多种类型的转换:

../../_images/animtree12.png
  • 立即 :将立即切换到下一个状态。当前状态将结束并混合到新状态的开始。

  • Sync :将立即切换到下一个状态,但将查找新状态到旧状态的播放位置。

  • 在末端 :将等待当前状态播放结束,然后切换到下一状态动画的开始。

转换也有一些属性。单击任何转换,它将显示在Inspector Dock中:

../../_images/animtree13.png
  • 切换模式 是转换类型(见上文),可以在此处创建后进行修改。

  • 自动前进 将在达到此状态时自动打开转换。这对 在末端 切换模式。

  • 提前条件 设置此条件时将启用自动前进。这是一个自定义文本字段,可以用变量名填充。可以从代码中修改变量(稍后将详细介绍)。

  • X衰减时间 是在这个状态和下一个状态之间交叉淡入淡出的时间。

  • 优先 与一起使用 travel() 来自代码的函数(稍后将详细介绍)。当从一个状态移动到另一个状态时,请将此节点放在更优先的位置。

  • 残疾人 允许禁用此转换(在行驶或自动前进期间不使用)。

根部运动

使用三维动画时,动画制作人员常用的一种技术是使用根骨骼骨骼为骨骼的其余部分提供运动。这允许以步骤与下面的地板实际匹配的方式设置角色动画。它还允许在电影中与物体进行精确的交互。

在Godot中回放动画时,可以选择此骨骼作为 根部运动轨迹 . 这样做将从视觉上取消骨骼转换(动画将保持在原位)。

../../_images/animtree14.png

然后,可以通过 AnimationTree API转换:

anim_tree.get_root_motion_transform()
animTree.GetRootMotionTransform();

这可以输入到诸如 KinematicBody.move_and_slide 控制角色的移动。

还有一个工具节点, RootMotionView ,可以放置在场景中,并作为角色和动画的自定义地板(通常在游戏期间禁用此节点)。

../../_images/animtree15.gif

从代码控制

在构建树并预览它之后,剩下的唯一问题是“如何从代码中控制所有这些?”.

请记住,动画节点只是资源,因此它们在所有实例之间共享。直接在节点中设置值将影响使用该值的场景的所有实例 AnimationTree . 不过,这有一些很酷的用例,例如,您可以复制和粘贴动画树的部分,或者在不同的动画树中重用具有复杂布局(如状态机或混合空间)的节点。

实际动画数据包含在 AnimationTree 节点和通过属性访问。检查的“参数”部分 AnimationTree 节点查看可实时修改的所有参数:

../../_images/animtree16.png

这很方便,因为它可以从 AnimationPlayer 或者甚至是 AnimationTree 本身,允许实现非常复杂的动画逻辑。

要从代码中修改这些值,必须获取属性路径。将鼠标悬停在任何参数上都可以轻松完成此操作:

../../_images/animtree17.png

允许设置或读取:

anim_tree.set("parameters/eye_blend/blend_amount", 1.0)
# Simpler alternative form:
anim_tree["parameters/eye_blend/blend_amount"] = 1.0
animTree.Set("parameters/eye_blend/blend_amount", 1.0);

状态机行程

Godot的一个好特征 StateMachine 实施就是旅行的能力。可以指示图形从当前状态转到另一个状态,同时访问所有中间状态。这是通过A完成的 * 算法。

要使用旅行能力,您应该首先检索 AnimationNodeStateMachinePlayback 对象从 AnimationTree 节点(作为属性导出)。

var state_machine = anim_tree["parameters/StateMachine/playback"]
AnimationNodeStateMachinePlayback stateMachine = (AnimationNodeStateMachinePlayback)animTree.Get("parameters/StateMachine/playback");

一旦检索到它,就可以通过调用它提供的众多函数之一来使用它:

state_machine.travel("SomeState")
stateMachine.Travel("SomeState")