Godot 4.5的官方资料明确说,AnimationTree本身不保存自己的动画,而使用AnimationPlayer所包含的动画。两者都能用于二维或三维场景。这里先区分动画资料的所在与组织播放的节点;看到动画树中的一个名称,不等于又找到了一份独立保存的动画片段。[1]

树中的子节点又有不同角色。Animation节点引用已关联AnimationPlayer的动画,Animation Root节点混合子节点并可以嵌套,Animation Blend节点则在BlendTree内部接收多个输入、给出一个输出。文档所列BlendTree默认具有Output,直接接到输出的Animation节点可以播放所指动画;Blend2、Blend3和逐轨道过滤,又分别描述输入之间的混合及哪些轨道参与。[1]

BlendSpace2D的“二维”首先属于一个虚拟混合空间。类说明把AnimationRootNode放在二维坐标上,并将当前Vector2值所在三角形的三个动画作线性混合。三角形的顶点对应动画,当前位置决定这三个对象怎样参与结果;这些坐标不是文档替角色指定的世界位置。教程另说该空间可用Delaunay自动形成三角形,而BlendSpace1D只有一条线,不使用三角形。[1][2]

同一混合空间还保留了时间方面的选择。Discrete不是线性混合三个动画,而是播放距混合位置最近的那个动画节点;Discrete Carry在此基础上,让新动画从上一个动画的播放位置开始。4.5的sync布尔属性另规定:为假时,混合值为零的动画停止推进帧;为真时则继续推进。选中哪段动画、从片段的哪个位置开始、零权重时是否继续走时,因而是三个不同问题。[2]

状态机又用另一种图表达关系。文档所述AnimationNodeStateMachine默认有Start和End;其中的状态可以是动画,也可以是混合空间、混合树,甚至另一状态机。一个状态因此可能承载更复杂的子结构,状态之间的连接才由transition描述,不能把状态图里每个名字都直接计成一段单独动画。[1][3]

转换类型分别给出何时离开当前状态、怎样进入下一段。Immediate立即切换,并向新动画起始处混合;Sync也立即切换,但把新状态的播放位置移到旧状态所在的位置;At End则等当前播放结束,再切到下一动画开头。Sync保留的是播放位置关系,At End保留的是等待当前结束的条件,两者没有因为都涉及时间而成为同一规则。[3]

交叉淡化时间和目标起点又有自己的字段。Xfade Time描述两状态之间交叉淡化持续多久,Xfade Curve描述淡化曲线,reset则决定目标动画在切换时是否从开头播放。一个字段回答过渡怎样展开,另一个回答目标从哪里开始;记录有淡化时间,还没有同时说明reset的取值。[3]

Advance Mode描述转换在什么语境下使用。Disabled不使用这条转换;Enabled只在状态机travel的语境中使用;Auto则在已指定的advance condition和advance expression检查为真时自动使用。教程也保留未设置这些条件时的自动情形。因此Enabled这个名字本身,不表示一条转换已经满足自动前进的条件。[1][3]

条件与表达式并非两个相同的输入框。Advance Condition只检查具名布尔值是否为真;Advance Expression能够评价表达式。教程还说,前者出现在AnimationTree的参数中,后者由另一个脚本持有。它们参与同一转换判断,却在表达能力与资料所在上不同。另一方面,动画子节点作为资源可由多个实例共享,树的可变参数则列在AnimationTree的属性中;共享的组织资源与实例中的参数资料并不处于同一层。[1][3]

本篇采用官方godot-docs的4.5分支文字,未观看图示、运行代码或改变项目配置,不把master或较新版本的同步模式并入4.5。三份资料的首次发布日期未确认。

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。