一.实现目标
将第三人称项目运行时的小白人替换为我们自己的角色,并为其配置动画蓝图
二.前置知识
1.动画蓝图
1.什么是动画蓝图?
动画蓝图 是一种特殊的 蓝图,它用于在游戏中控制 骨骼网格体 的动画效果。动画蓝图编辑器(Animation Blueprint Editor) 中的 图表(Graphs) 可以效果动画,允许你直接控制骨架的骨骼,或设置骨骼网格体逐帧逻辑,以便创建最终动画姿势。
2.动画蓝图界面
1.工具栏:包含管理动画蓝图和切换编辑器类型的按钮。
2.视口:预览动画蓝图逻辑对于角色动作的影响。
3.我的蓝图:罗列图表、函数、变量以及其他与动画蓝图相关的属性。
4.图表:显示在动画蓝图中用于可视化脚本的各种图表
一共有三种图表,各自使用不同的界面:
-
事件图表(Event Graph) 可以构建基于蓝图的逻辑,用于定义节点的属性和包含其他图表区域信息的变量。
-
动画图表(Anim Graph) 用于构建基于姿势的逻辑,可以为当前帧评估骨架网格体的最终姿势。
-
状态机(State Machines), 用于构建基于状态的逻辑,通常用于移动。(状态机图表需要在动画图表中自行创建)
5.细节:显示选中物体的属性。
6.动画预览编辑器:对默认的变量和类进行修改。另外的选项卡中的资产浏览器(Asset Browser) 可以用来查看并打开与当前骨骼相关联的动画资产。
2.混合空间
混合空间(Blend Space)是一个非常重要的概念,特别是在角色动画和运动系统中。混合空间主要用于平滑地过渡和混合多个动画状态,以创建自然、流畅的动画过渡效果。
1.什么是混合空间?
混合空间是一种能够根据多个输入参数(通常是角色的运动状态)来动态调整动画的工具。例如,在角色的移动动画中,混合空间可以根据角色的速度、方向或其他控制变量来选择和过渡不同的动画(如走路、跑步、跳跃等)。
2.UE中的的混合空间类型
-
1D 混合空间(1D Blend Space):
这是最简单的混合空间类型,它只使用一个输入参数来混合多个动画。常见的应用场景是根据角色的速度来选择不同的动画,例如从站立到走路,再到跑步。速度作为输入参数,越快的速度切换到越快的动画。 -
2D 混合空间(2D Blend Space):
2D混合空间使用两个输入参数来控制动画的过渡,这允许在更复杂的状态之间平滑过渡。例如,你可以根据角色的速度(X轴)和方向(Y轴)来选择不同的动画状态。这种类型的混合空间广泛应用于角色的运动系统中,例如走路时不仅要考虑角色的速度,还要考虑角色的朝向(如向前走、向左走、向右走等)。
这里简单举个例子,假设你有站立,走路,跑步和转身的四段动画序列。
在一个1D 混合空间中,你可以用角色的速度(如:0到500)作为X轴,然后根据这个值混合站立、走路和跑步动画。
在一个2D 混合空间中,你可以同时使用两个参数:
X轴:角色的速度(从0到500(自定义的最大值))
Y轴:角色的朝向(例如,前进、后退、左转、右转等)。
这样,混合空间就能够根据角色的速度和方向,选择出最合适的动画,从而实现更加流畅和自然的过渡。
3.混合空间的工作原理
-
定义输入参数:首先,确定用来控制混合的输入参数。这些输入参数可以是角色的速度、朝向、加速度、重力等.
一般混合空间外部暴露的参数值就是水平轴(或竖直轴)的名称(如下图),我们在1D混合空间中的水平轴的名称(见下图左上部) 与 在动画图表中暴露的参数的名称是一致的。
我们在去动画图表中看一看混合空间所暴露的参数的名称(见下图)
-
创建混合空间:在虚幻引擎的动画蓝图中,你可以创建一个混合空间,并根据你的输入参数定义不同的动画片段。
-
动画过渡:当输入参数发生变化时,混合空间会根据这些变化平滑地过渡到相应的动画。例如,随着角色从站立状态到走路、跑步的状态过渡,混合空间会动态选择合适的动画并平滑过渡,避免了单一动画之间的突兀切换。
-
平滑过渡:混合空间不仅仅是选择动画,它还会根据输入的参数,计算出动画的权重。例如,角色速度为300时,混合空间可能会选择介于走路和跑步之间的动画,而不是单独的走路或跑步动画。
混合空间的应用场景
-
角色运动:角色的行走、奔跑、跳跃、蹲伏等动画状态都可以通过混合空间来控制和过渡。例如,角色的行走动画不仅取决于它的速度,还与其行走的方向密切相关(前进、后退、左转、右转等)。
-
武器动作:角色持枪或持剑等武器时,混合空间可以根据角色的动作(如跑步、站立、蹲伏等)来选择不同的武器动作动画。
-
面部表情和体态变化:混合空间也可以用来控制角色的面部表情或体态,如根据角色的情绪状态(高兴、愤怒、悲伤等)来混合不同的表情动画。
3.动画状态机
1.(UE5动画蓝图中的)状态机是什么?
状态机(State Machines) 是一种可以在 动画蓝图(Animation Blueprints) 中构建的模块化系统,用来定义动画的播放状态和播放时机。这类系统主要用于将动画与角色的动作状态相关联,例如空闲、行走、奔跑和跳跃等状态。借助状态机,你可以创建各种 状态(State) ,定义要在这些状态中播放的动画,并创建各类 转换(Transition) 来控制何时切换到其他状态。这样,你就能更轻松地创建出复杂的动画混合效果,而不必使用过于复杂的动画图表。——摘自虚幻引擎文档
状态机通过图形化方式将骨骼网格体的动画拆分为一系列状态,之后按照 转还能规则管理这些状态,转换规则可以控制从一个状态混合到另一个状态,状态机大大简化了骨骼网格体动画的设计流程,可以创建一张控制图来控制各个角色在各动画之间的运动方式。
2.创建动画状态机
我们可以在动画蓝图中的动画图表中创建动画状态机
可以看到,这里的动画状态机其实是动画图表下的一个子图表
3.状态转换
状态机的起点是Entry节点,状态机内部右键创建状态,不同状态间的转换表明了状态之间的连接关系,定义了状态机的结构。
关于导管 ,别名的知识 详见虚幻文档。
三.开始制作
1.准备工作
1.为项目设置默认启动关卡
为了使当前关卡成为在之后再次打开项目的默认关卡,我们找到项目设置中的项目-地图和模式栏下,替换默认启动关卡(见下图),我指定的关卡名字是ModleIK_Rig。
2.准备自己的Character角色蓝图
导入并找到第三人称项目包中的BP_ThirdPersonCharacter,复制得到一份副本。我这里命名为BP_MyCharacter,通常来说,为了便于管理我们的自定义资源,我们一般会规范资源的命名前缀和文件的位置,之后我在内容文件夹内新建文件夹BluePrint,将复制的蓝图移动到我们的BluePrint文件夹内。
双击蓝图进入,我们先在角色的骨骼网格体组件中的网格体替换为我们上次用的简,现在默认的动画蓝图可能并不适配你的角色,我们可以现在就创建自己的动画蓝图,在BluePrint文件夹内新建文件夹 AnimBluePrint来放置动画蓝图,这里我为简的骨骼网格体创建动画蓝图,并替换动画栏目下动画类的资产(见下方),现在直接运行的话是没有动画的,我们后面会进行动画蓝图内部的制作。
注意,如果你直接在空白的关卡中拖入角色蓝图,我们默认是没有玩家控制权的,需要先在角色细节面板下的pawn栏目中选择玩家0,现在再运行,我们才能获得玩家的控制权。
3.准备动画蓝图中使用的动画序列
是时候为我们的角色选择心仪的运动动画了!
这里我从模型动画网站Mixamo上下载了模型和动画。
由于我们需要基于自己角色的角色骨骼的动画序列,我们首先需要制作一个动画重定向器来将Mixamo的动画复用到我们自己的骨骼网格体上。(具体制作流程可以看上一期的相关内容)
这里我为自己的角色选择了几段动画并导出:
准备工作基本完成
2.完成动画蓝图
1.实现地面移动Movement
前置知识:需要了解混合空间
(1)创建1D混合空间
接着我们从简单的开始,先创建一个混合空间1D用来进行地面移动(Idle Walk Run FastRun)的混合。
进入混合空间界面,右下部是当前骨骼网格体所拥有的动画序列资源,可以拖拽到水平轴上,会
成为一个(很像关键帧)的菱形小图标,我们把需要用到的动画按顺序都拖拽到水平轴上,默认的动画时间轴是0~100,我们可以在左上部水平坐标下的最大轴值修改为任意值。这里我将最大轴值修改为了1000。
届时,我们的混合空间就会根据输入的水平轴的参数的大小选择不同的动画(进行插值)进行播放,我们一般会将这个最大轴值与我们角色蓝图中移动组件的最大行走速度保持一致。
(2)在动画图表中使用混合空间
(绿色表示一般的动画序列,橙色就表示混合空间),我们为混合空间的水平轴值连接到动画蓝图内的一个float变量,这个floae变量(此处的speed)后面就控制我们的水平轴值,我们会在事件图表中时刻读取角色的行走速度,并将速度大小存储到这个speed变量中。根据speed的不同,我们的角色就会播放不同的动画。
(3)在事件图表中读取角色当前speed
在事件图表中,我们会获得或读取当前角色控制器及其组件中的数据,存放在动画蓝图中的变量中,进而供我们在动画图表中使用(例如 控制状态的切换 或 混合空间的轴值)
我们需要获得pawn的当前速度,进而对该返回的向量取模得到速率,赋值给我们的speed变量
点击编译,现在运行,我们的角色就会按照动画蓝图进行动画的选择播放。
2.实现跳跃与下落动画
前置知识:需要使用状态机
接着制作跳跃与下落动画的切换。我们选择使用状态机来完善我们的角色移动动画。
(1)创建动画状态机
我们在动画图表中创建一个动画状态机,这里我命名为CharacterMovement。
这里我简单分了4种状态,movement表示角色在地面上的运动,三种jump表示空中的状态。(见下图) 。我把Jump像UE5实例的小白人一样拆分为三部分,起跳,空中循环和落地,即三段跳跃动画序列。如果你的跳跃动画是整合在一起的,那么就只需两个状态。
(2)配置各个状态输出动画
我们分别进入状态内部,链接输出本状态对应的动画序列。
进入movement,利用上面制作的混合空间(见下图)
分别进入JumpUp JumpLoop JumpEnd,链接对应的动画序列即可
(3)考虑状态间的切换(转移)条件
接下来,我们需要考虑这些状态间的切换条件,我定义了一个bool变量,isFalling用来表示玩家是否处于离地状态。接着我们先取事件图表中获取一下控制器Pawn中移动组件的信息。下图是增加逻辑后的事件图表。
之后,我们回到状态机内部,点击两两状态间的转换箭头,书写满足转换的逻辑
*从Movement——>JumpUp: isFalling
*从JumpUp——>JumpLoop: 上一段动画播放剩余时长小于一定比例,混合进入下一段动画。
这里用到了LessEqual(!=)节点。
*从JumpLoop——>JumpEnd: !isFalling
这里使用了not equal 节点。
*从JumpEnd——>Movement: 上一段动画播放剩余时长小于一定比例,混合进入下一段动画。
3.尾声
我们可以整理一下动画图表,我们可以使用CoachPose姿势缓存节点,注册一种动画(姿势)输出,见下图,当我们的动画图表变得更加复杂,这个节点可以让我们的图标结构更清晰可读。
使用Use CoachPose来进行已缓存姿势的使用。
注意,每次我们调整完动画图表,我们都应该进行重新编译。
点击运行,我们的角色进行正常移动,移动和跳跃时可以正常播放对应的动画。
本篇完~