参考
Unity动画系统详解5:BlendTree混合树是什么?
在游戏动画中一个常见的任务是将两个或多个相似的动作混合在一起。也许最著名的例子就是根据角色的速度混合行走和跑步的动画。另一个例子是一个角色在跑步时向左或向右倾斜,就是根据参数来混合,决定当前播放的是哪个动画。
“混合树和Transition中的混合不同,Transition中的混合只是在两个State转换时,在给定的时间内进行混合,避免动画切换过于突兀。而混合树中的混合,是时时刻刻进行不同程度的混合。比如你的角色有站立、走、跑三个动作,走路的速度是2m/s,跑的速度是5m/s,那你想让角色的速度是3m/s,这时候怎么办?这时候用混合树就能很简单地解决。”
image.png双击这个节点,进入BlendTree内部图。选中后,看一下属性
image.png
一、1D混合
image.png1.Parameter
这里参数只能选Parameters中的float类型。
2.Add Motion
可以点击小加号按钮,或者在Blend Tree节点上右键Add Motion。点击后会在Motion列表中添加一个条目,可以将Animation Clip拖进来。
image.png
3.Threshold
image.png最上面的图显示了参数对每个动画的影响。每个动画显示为一个蓝色的三角形。如果点击这个三角形,会在下面的动画列表中高亮一下。每个三角形的顶角位置定义了参数在该位置时,会完全使用这个动画,这个值也叫做该动画的阈值(Threshold)。比如上图中的walking动画,阈值是1,在混合图的中心位置。
图中的红线代表了参数的数值,主要是用来预览调试。可以拖动红线,在下面预览窗口观察动画式如何混合的。
image.png
4.参数范围
image.png上图中,左右两个数字代表了参数的范围。点击数字可以变成输入框修改,也可以在数字上拖拽调节。修改时会影响到第一个动画和最后一个动画的阈值。
5.Automate Threshold
修改动画对应的阈值可以直接拖拽对应的蓝色三角形。如果没有勾选Automate Threshold(自动计算阈值),也可以在阈值编辑框中直接输入数值。选中Automate Threshold(自动计算阈值)时,阈值会自动在最小值和最大值之间自动平均分布。
6.Compute Thresholds
下面有一个Compute Thresholds下拉框,使用这个下拉框,可以根据动画中的数据,自动计算阈值。数据包括:speed(速度),velocity x、y、z(xyz三个轴分别的速度),angular speed(转动速度,单位是角度或弧度)。
这些数据如何知道呢?
比如:走路动画的速度是1.5m/s,跑的速度是4m/s,如果选择Compute Thresholds中的Speed,walk动画的阈值会被设置为1.5,run动画的阈值会被设置为4。
7.Time Scale
image.png通过动画速度这一列(图标是一个表)可以调节动画的播放速度,比如你想让跑步的动画播放速度变为原来的2倍,可以设置为2。
image.pngAdjust Time Scale > Homogeneous Speed 可以将动画的速度调整对应到参数的最小值和最大值,但是保持动画的初始相对速度。
这句话看得我欲生欲死,得问问大智是什么意思
按钮可以将动画的播放速度调整到动画列表中所有动画速度的平均值。
8.Mirroring 镜像
image.png上面复选框可以左右镜像一个humanoid类型的动画Clip。这个功能可以使用同一个动画创建出来两个方向的动画,可以节省一倍的存储空间和内存。
比如一个向左走的动画,通过镜像可以创建出一个向右走的动画。
9.难点解析一 自动计算Threshold的时候,那些动画的速度啊,旋转速度怎么知道啊?”
“选中一个Animation Clip,你可以看到这些数据,比如这个:”
image.png
“第一行是这个动画在xyz轴上的速度,第二行是旋转速度。”
注意这里必须是Humanoid类型的动画才有
10.难点解析二 Adjust Time Scale > Homogeneous Speed
我记得文档中的解释有一些难理解,其实这个按钮的作用就是:先将所有动画的平均速度算出来,然后通过调节动画的speed让所有动画的速度都一致。
11.其它案例
可以参考《学Unity的猫》——第十六集:Unity动画使用混合树BlendTree实现动画过渡控制
二、2D混合树
2D混合树有三个选项,分别是:
- 2D Simple Directional(2D简单方向):当你的运动代表不同的方向,如“向前走”,“向后走”,“向左走”,“向右走”,或“向上瞄准”,“向下瞄准”,“左瞄“和”右瞄“。当然了,可以在(0,0)处包含一个默认动作类似“空闲站立”或“直线瞄准”。与1D混合树不同的是,2D Simple Directional不是在同一个方向上的多个动作,比如“走”和“跑”。
- 2D Freeform Directional(2D自由方向):动画运用有不同的方向时,也可以使用这种混合类型:可以在同一个方向上有多个运动,例如“走”和“跑”。在Freeform Directional类型中,(0,0)位置必须包含一个默认动作,如“空闲站立”。
- 2D Freeform Cartesian(2D自由笛卡儿):当混合的2个参数不代表不同的方向时使用。使用Freeform Cartesian,参数X和Y可以表示不同的概念类型,例如角速度和线速度。举个例子:“向前走不转向”,“向前跑不转向”,“向前走并右转”,“向前跑并右转”等动作。
如果角色动画包含站立、走、跑和转向,非常符合2D Freeform Cartesian这种类型。后面以2D Freeform Cartesian举例说明。
image.png
1.设置参数
在Animator中添加两个float参数:Turn和Forward分别代表转向速度和向前行进速度,然后将这两个值设置为混合树的参数(注意顺序)
2.Add Motion
然后点击 + > Add Motion Field 添加下列动画clip到混合树动画列表。(先不管后面的值)
下面,我们可以使用Unity中提供的自动计算Pos值的功能,来自动计算混合树的阈值。
3.Positions详解
每一个Motion都有一个自己的位置,当参数(x,y)靠近这个位置时,这个动画就会参与混合。离得越近,这个动画的比重就越大。
选中一个Motion时,图中的蓝点会有选中的状态;同样选中混合图中一个蓝点,对应的Motion也会有选中的状态。
image.png
可以拖动混合图中相应的蓝点来修改位置,也可以直接修改Motion后面的值。
红色的点是当前参数的“位置”。如果在Inspector面板下方的预览区域点击Play,并在图中拖动红点的位置,可以看到不同参数位置的混合效果。在图中还可以看到每个动作的混合因子,被绘制成围绕动作的点的圆圈。当把红点拖到蓝点上方时,该圆圈的半径会达到最大,而其它动作的圆圈就没有了。在动作之间的位置,会有多个动作参与混合。如果你选中一个动作的点,查看它的混合因子值域图(蓝色区域),你会发现,红点在约深颜色的位置,动作的圆圈半径越大。
当没有动作点被选中时,混合图会混合所有动作的值域图,并且单个动作混合因子越大,颜色越深,影响的动作越多,颜色越浅。
4.Compute Positions
Unity提供了自动计算Position的功能。
image.png
通过Compute Position下拉菜单可以选择不同的计算方式:
- 属性功能Velocity XZ根据动画自身的速度,将velocity.x设置每个动画的Pos X,将velocity.z设置Pos Y。适合2D Simple Directional和2D Freeform Directional类型的混合树。
- Speed And Angular Speed将动画的Y轴角速度(弧度每秒)设置到Pos X,速度设置到Pos Y。适合2D Freeform Cartesian类型的混合树。
- 另外,还可以通过 Compute Position -> X Position From 或 Compute Position -> Y Position From 单独计算X或Y的值。
属性功能Speed动画的速度
- Velocity X沿X轴的速度
- Velocity Y沿Y轴的速度
- Velocity Z沿Z轴的速度
- Angular Speed (Rad)Y轴的角速度,单位是弧度/秒
- Angular Speed (Deg)Y轴的角速度,单位是角度/秒
Rad 和 Deg 分别代表了弧度和角度,弧度π(3.1415…) = 180°
可以根据项目的需要来选择,两种都可行,但是如果X,Y的数值相差过大的话,在混合图上显示会不便于调试。
在模型的Import Settings面板可以看到动画的速度
image.png
5.预览
这里我下载的动画素材,没弄出来。参考下原作者的吧:
参考上面的内容,我们可以使用Speed And Angular Speed来计算每个Motion的位置。设置完后,整个混合树如下图所示:
image.png
cb6ab060-2362-11eb-a200-8e279300b67d 00_00_00-00_00_30.gif
也可以参考B站视频:https://www.bilibili.com/video/BV1cx411y7mu
6.混合的原理
动画混合时,会根据X和Y两个值来确定混合的动画以及各自所占的比重。上面动图中我们可以看到,拖动红点时,可以看到不同的节点上面圆圈在发生不同的变化,圆圈的大小即这个动画所占比重的大小。
image.png
红点所在的位置代表了X和Y两个参数的值对应的位置。横轴是X,纵轴是Y。
7.难点解析
“大智,这个2D混合树中的阈值和动画中的真实速度是对应关系么?”
“其实只要保持对应的相对比例就可以,并不一定要真实的速度:”
- X,Y的值和动画的实际速度没有映射关系。我们也可以将“走”的动画的Y值设置的大一些,将跑的动画设置的小一些。但是这样设置会在表现上不符合玩家的预期,感觉怪怪的。
- 在手动调整时,只要点之间的相对位置保持不变,混合效果不会受太大的影响。
- 但是要注意在写代码的时候,要根据调整过后值的范围来设置对应的参数。
三、Direct Blending 直接混合
直接混合可以直接将animator的参数映射到混合树动画的权重。这在什么时候使用呢?如果你想用参数精确控制混合的动画,而不是通过以两个参数间接控制动画的混合。
image.png image.png
设置一个direct混合树时,motion列表中的每一个动画需要对应一个参数,用来控制这个动画的混合权重。
网友评论