文章目录
Blend Tree
游戏中,可能需要混合多个动画来实现一些效果。比如,通过角色的移动速度,来混合走和跑。再比如跑的过程中,转弯时,需要向左或向右倾斜。
可以用blend tree来实现该效果。bend tree用来平滑地混合多个同时播放的动画,根据参数确定混合比例。
当用来混合类似走跑时,需要确保2个动画,在归一化时间上,脚接触地面的时间必须要一致。比如在时间0时都是左脚,0.5时,都是右脚。
在Animator Controller编辑窗口中,右键,Create State->From New Blend Tree,来创建Blend tree,然后双击该State,进入Blend tree编辑状态。
点击Inspector的 + 号,添加一个动画
也可以右键点击blend tree 节点,Add Motion
当为blend tree添加好动画,以及控制它们的参数后,Inspector窗口可以显示这些参数如何控制动画混合。
选中一个动画节点,则Inspector会显示动画导入设置,但是是只读的
选择Blend tree 节点,则显示混合控制参数
还可以选择1D或2D混合模式
1D Blending
1D Blending 使用一个参数来混合子动作。
首先要选择一个控制混合的参数(Animator Controller)中定义的float参数。例如,我们可以定义移动方向为-1到1,0表示直线前行,不需要倾斜。
然后点击Motion旁边的 “+” 号来添加动作,像下面这样:
上图展示了参数从最小到最大值,对子动作的影响,每个动作显示为蓝色三角区域。在区域上点击并按住鼠标左键,Motion列表中的对应动画将会高亮显示。区域的尖峰表示在对应的参数值时,动作完全影响混合,即混合因子为1,其它动作的混合因子为0。该峰值也叫做动作 Threshold 阈值。
红色的垂直条表示当前参数值。如果点击Inspector下方的play(播放)按钮,并拖动该条,则能看到参数时控制这些动作混合的效果。
Parameter Range
上图下部的Range of parameter展示了用来控制混合的最小(左)和最大(右)值。可以在图中1st motion和3st motion 中按住鼠标左键,拖动来改变这2个值。但是第一个和最后一个定义了参数范围。
Threshold 阈值
每个区域都可以通过拖动来定义动作最大影响对应的峰值,当Automate Threshold 未被选中时,也可以在Motion List 的 Threshold手动填写这些值,但要注意,第一个是最小值,最后一个最大值,如果将中间的改为最大或最小,动画列表会自动调整顺序,保证最大最小值的有效性。
Threshold 后面的时钟表示改动作播放的速度。
Automate Thresholds 自动分配阈值
动作列表下面是 Automate Thresholds 复选框,启用它,会自动在动作之间平均分配 Threshold,例如参数范围是-90到90,有5个动作,则每个动作的阈值为-90,-45,0,45,90。
Compute Thresholds 计算阈值(根据Root Motion数据)
当不选择 Automate Thresholds 时,还可以选择 Compute Thresholds列表的里的数据来源参数,来从Animation Clip的Root Motion数据中获取阈值。可以选择 Speed, velocity x,y,z,angular speed(角度或弧度)。如果你的参数时根据root motion中的以上属性来确定的话,可以使用Compute Threshold下拉列表中的选项来计算阈值。
属性 | 功能 |
---|---|
Speed | Root Motion 的移动速度 |
Velocity X | Root Motion 的速度向量的x值 |
Velocity Y | Root Motion 的速度向量的y值 |
Velocity Z | Root Motion 的速度向量的z值 |
Angular Speed (Rad) | Root Motion 的旋转速度(弧度表示) |
Angular Speed (Deg) | Root Motion 的旋转速度(角度表示) |
比如说,你有一个走的动画,速度为 1.5units/sec,小跑动画速度为 2.3units/sec,跑动画速度为 4units/sec,则可以选择Speed,来从root motion计算阈值。当设置speed 为3时,会播放小跑和跑之间的动画,稍微偏向小跑。
2D Blending
2D Blending 类型,使用2个参数来控制动画混合。这两个参数可以构成一个2D坐标系,当设置不同参数时,得到一个该坐标系下的方向向量。如Position(0,0)表示中心点,可能代表某个动作。Threshold的值,会将该坐标系划分成多个象限(区别于x,y的4象限),动作会在相邻象限之间进行插值计算动作混合因子。注意象限的分界线(Threshold)是一个动作的完全影响因子(weight=1)。
不同的 2D Blend Types 适用于不同情况,它们的不同主要时计算动画混合因子的方式不同。
- 2D Simple Directional:适用于动画表示不同的方向:向前后左右走,上下左右瞄准,还可以包含一个Position(0,0)表示的动作,比如站立,向前瞄准。使用该类型时,不要在一个方向(2D blending方向)上有多个动作,比如向前走和向前跑。
- 2D Freedom Directional:同 2D Simple Directional一样适用于不同方向的动作控制,同时允许一个方向上设置多个动作,比如向前走,向前跑。但是该类型要求必须有Position(0,0)的动作,比如站立。
- 2D Freedom Cartesian:适用于要实现的不是不同方向的控制(区别于Directional),该模式下,参数x,y可以表示不同的概念。比如角速度(angular speed)和线性速度(linear speed)。例如,直线走,直线跑,右转走,右转跑。
- Direct:用来根据权重直接混合多个动画,通常用来实现表情动画。
选择好类型后,设置2个参数。我们的例子使用velocityX(左右横移速度),velocityZ(前后移动速度),来实现前后移动和左右横移的射击。
然后添加我们的动画,如下图:
图中的Position表示2个参数的值,X轴表示第一个参数,Y轴表示第二个参数。所以向前走的动画,velocityX=0,velocityZ=1.5,对应的阈值为Position(0,1.5)。
2D 混合图
Inspector上部的图,显示了子动画在2D空间中的“位置”。其中,蓝色的点是动画。没有配置动画,或者混合因子是0的动作,显示为灰色。可以在图中点击蓝点来选择动作。选中后,对该动作有影响的位置将会绘制成蓝色,颜色越深,该动作混合因子越大,蓝点处为1,其它的为0。距离越远,混合因子越小,其它动作的混合因子越大。
红色的点是当前参数的“位置”。如果在Inspector面板下方的预览区域点击Play,并在图中拖动红点的位置,可以看到不同参数位置的混合效果。在图中还可以看到每个动作的混合因子,被绘制成围绕动作的点的圆圈。当把红点拖到蓝点上方是,该圆圈的半径会达到最大,而其它动作的圆圈就没有了。在动作之间的位置,会有多个动作参与混合。如果你选中一个动作的点,查看它的混合因子值域图(蓝色区域),你会发现,红点在约深颜色的位置,动作的圆圈半径越大。
当没有动作点被选中时,混合图会混合所有动作的值域图,并且单个动作混合因子越大,颜色越深,影响的动作越多,颜色越浅。
Positions
可以直接拖动蓝色的动作点来改变位置,也可以在下面的动作列表中填写PosX和PosY的值来改变。
可以选择 Compute Position 下拉列表中的项,来指定从动画文件中获取参数及其范围。
可以同时指定2个参数映射
属性 | 功能 |
---|---|
VelocityXZ | PosX=velocityX PosY=velocityZ |
Speed and Angular Speed | PosX=AngularSpeedMoveSpeed PosY=MoveSpeed |
可以选择PositionX from 和 PositionY from 来选择单独映射参数。这些参数同1D
例如,你的参数对应侧移速度和前移速度,同时有一个站立动画,速度为(0,0,0),行走动画速度(0,0,1.5),侧移动画左右速度分别为(-1.5,0,0),(1.5,0,0)。选择VelocityXZ作为Compute Position的选项,则动画播放就会根据分别各自的速度混合。
Direct Bending
使用 Direct Bending 来直接根据每个动作的权重来混合动画。当需要分别精确的控制每个动作的混合比例时,使用改方法。
添加动作后,需要为每个动作设置其控制参数,来进行控制。
比较常用的是用来实现面部表情。