# 分层混合

动作游戏或 FPS 游戏中,经常会有人物上半身和下半身独立控制的需求。例如 FPS 游戏中,上半身有举刀、举枪、换武器、射击等动作,下半身有静止、跑、跳、蹲等动作。如果要为每一种组合创建一套动作,会使得 AnimationClip 非常冗余,影响资源加载时间和内存占用。分层混合可以有效的解决这类需求。

本章我们将基于一个正在奔跑的角色,为他添加一个持枪的动作。

首先我们为角色创建一个AnimatorController,内含一个Running状态。如果不知道如何创建角色或者Controller,请参考骨骼动画入门指引章节

Layers选项下点击加号图标,创建新的混合层(BlendLayer),命名为Upper。并在右侧添加Shooting状态,播放射击动作。

点击 Upper 右侧的齿轮图标,将 Blending 设置为Override,Weight设置为 1

保存动画状态机运行,发现播放了站立射击的动画。原因是BaseLayer层中的Running动画被Upper层的Shooting动画覆写(Override)了

# 使用AvatarMask

小游戏框架中我们使用骨架蒙板(AvatarMask)资源,用来表示骨骼的每一个节点是否要受该层级动画的控制。 在这个案例中,实际上要求上半身是射击的动作,下半身是奔跑的动作。所以我们只需要创建一个AvatarMask,并且选中上半身的节点,并让Upper混合层使用该 AvatarMask 即可。

Project面板中,右键->新建->Animation->avatarmask,即可创建一个AvatarMask。进入Inspector面板中,在Use Skeleton from中选择Running动画的骨架,即可将骨架配置导入。

导入后即可看到该骨架的全部节点的层级关系,前面的勾选框表示该节点是否要受控制。我们将 Hips 节点、LeftUpLeg及其子节点、RightUpLeg及其子节点取消勾选,其余的节点即表示上半身。

进入 Upper 混合层的配置中,将 Mask 字段设置为刚刚创建的AvatarMask。

保存状态机,运行场景,即可看到分层混合后的效果