快捷键
快捷键 ctrl+E 可以快速打开相关蓝图类,直接在场景选中添加到场景中的对象即可。
调试蓝图
选中调试对象,选中需要调试的实例,即可查看当前角色的状态。
动画实例在运行的时候,也可以在右侧箭头获取当前场景已经生成的实例,查看当前角色动画的运行状态。
设置默认进入场景
项目设置中,选择地图和模式,有编辑器开始地图和打包游戏后默认进入地图。
资源管理
可以在内容根目录分场景,角色素材,粒子特效,蓝图,武器,音效,ui等文件夹,用于存放相应的资源。
输入映射
输入映射就是自定义硬件的输入,可以自定义每个输入设备的输入内容(手柄,键盘,方向盘,vr等)。
映射主要使用两种:操作映射和轴映射
操作映射 会通过相应按键触发,在蓝图中可以获取按下抬起等相关事件。按下只能触发一次,抬起再按下才能再次触发。
轴映射 会通过长按持续触发,引擎会持续监听。
轴映射可以设置角色移动以及鼠标移动相机方向
如果不方便查找相应键位,可以点击左侧的图标,然后按键盘上相应的键位即可。
创建相机控制蓝图
在文件夹内右键,选择蓝图类
然后选择角色蓝图类,这是ue内置的基础类,角色蓝图是一个创建角色基础的蓝图,里面内置了一些节点可以让创作者轻松创建出一个可以在场景中移动的角色,我们可以基于此基础进行扩展。
蓝图内容分为两大部分,一部分是节点common,可以在内部添加碰撞体,模型等。另一部分就是相关组件脚本,相当于unity挂载的运行脚本,可以给蓝图增加一个主要的功能。
我们可以在组件的左上角发现添加按钮,通过选择添加常见的组件,或者自定义脚本组件。
当前蓝图内置的组件:胶囊体组件碰撞检测使用,箭头组件用来表示正方向,网格体组件为角色模型,角色移动脚本组件为当前蓝图的一些角色属性以及设置。
添加相机
角色蓝图默认不含有相机,制作第三人称蓝图,会有相机默认跟随人物移动,所以,我们需要在蓝图内添加一个跟随的相机。
选择添加,首先在蓝图上添加一个弹簧臂组件,然后在弹簧臂组件下面添加一个摄像机组件。
创建图表
图表相当于一个个的逻辑代码文件,我们可以在图表内配置运行逻辑,事件触发逻辑等等。
在我的蓝图,添加,图表,创建一个新的图标,用于一些输入控制角色操作。
在蓝图区域,鼠标右键搜索,你会发现有两个名字的操作,一个是坐标轴事件,这个是用于触发事件,另一个是坐标轴值
这两个是有区别,一个是事件触发并且可以获取值,另一个只能够获取到值。
上图为鼠标控制相机朝向节点链接。
但是输入是设置的控制器,控制器不代表能够控制弹簧臂的移动,所以,我们还需要一个额外的设置才可以让控制器的控制去修改弹簧臂。
将使用Pawn控制旋转勾选,即可实现其内部的事件传递。如果我们不选择这个属性,那就需要自己去手动控制
这里个人理解,你自己也可以写事件去实现弹簧臂的旋转,但是有默认的方法实现,没有特殊要求,就没必要频繁造轮子了。
还有,我们这是鼠标的时候,后面有个缩放系数,如果游戏中需要调节鼠标灵敏度,可以直接将这个系数调大或者调小,实现鼠标旋转灵敏度的调节。
运行起来我们会发现角色也会跟着相机进行水平旋转,这个原因是类的默认值默认使用控制器旋转它的yaw,我们只需要将这个取消勾选即可。
修改弹簧臂
为了防止相机在角色的头后面,我们需要修改相机的位置,让相机朝着的位置总是靠右一些。这里我们通过修改弹簧臂实现。
首先将弹簧臂位置调到头部位置,让相机围绕着头部旋转,所以我们需要调整弹簧臂的位置到角色头部,然后再设置弹簧臂偏移。
弹簧臂的偏移可以在蓝图中修改,比如默认状态下偏移多少,持枪状态下偏移多少。
接下来,我们还要实现鼠标可以控制弹簧臂的远近,上图可以看到,我们只需要找到对象上面的目标臂长度,设置即可。
上面使用了三个新的节点,首先将弹簧臂节点拖拽到蓝图中,通过蓝图获取到目标臂长度,还有设置目标臂长度节点,以及先机范围节点,通过滚轮实现设置事件触发。
控制角色移动
要控制角色移动,首先要获取到当前的控制器的旋转朝向,基于相机的方向的前后左右进行前后左右旋转。
我们需要通过控制器的Yaw,也就是水平的方向,而不是控制器的多个方向,所以,我们需要通过它的Yaw进行创建一个新的朝向,这个方向也是归一化以后的,然后通过这个旋转体获取到向前的方向和向右的方向。然后通过这个方向根据按键触发再通过内置的方法设置移动方向。
这个方向就是角色的移动方向。然后根据设置的按键操作缩放数值,来实现移动。
接下来,我们发现角色移动朝向不是朝向移动的方向,我们需要在CharacterMovement内找到将旋转朝向运动,即可实现角色朝向运动的方向。
设置完成后,发现角色将会在移动时,朝向自动旋转。
到这里,我们学会了两种方式去控制角色朝向,第一种是使用控制器,在类的默认值设置,第二种就是使用运动方向控制。如果两个都开启,那么,两种都会实现控制,容易错乱。
动画蓝图
控制骨骼网格体动画的专用蓝图,简单来说就是专门用于多个动画之间的混合计算的蓝图。(注意事项:一定要选择对应的角色模型骨骼)。
选择当前角色模型使用的骨骼网格体
然后打开骨骼网格体,在左上角找到浏览,即可在资源列表中找到对应的文件
创建动画蓝图,首先右键列表找到动画蓝图类
骨骼选择当前角色的骨骼网格体,父类选择AnimInstance父类,创建一个纯净的动画蓝图。
打开以后样子是这样的
可以通过上面的预览网格体修改预览使用的网格体
事件图标用来设置动画切换逻辑,AnimGraph用来切换动画使用。
如果不小心关掉了,可以在左侧双击重新打开。
状态机
状态机中包含许多不同的动画状态,不同的状态直接可以进行混合、过渡、切换,可以有我们自己定义规则。
状态机只存在于动画图标AnimGrph。
右键输入状态机,第一个就是可以添加新状态机。
混合空间
混合空间能够让动画混合,比如走和跑,我们可以通过当前角色的移动速度,让角色自动混合从走到跑的过程,不会产生僵硬的切换。
创建混合空间也需要对应的骨骼网格体。
在资源列表鼠标右键选择动画,下面混合空间1D(单个数值控制的动画混合),可以创建一个最简单的混合空间。
接下来创建一个移动的混合空间
打开水平坐标,设置名称,然后设置最小轴值0,最大轴值为角色移动时达到最大速度后的移动值。网格划分可以设置被最大速度整除的值,这样方便放置动画放到一个整数上面。
想预览动画,可以全选动画,然后设置当前预览网格体,就可以查看当前动画。
可以将播放的动画拖拽到下面列表中,选中节点也可以在上面设置具体数值。
长按ctrl键设置预览点(绿色)
取样平滑这里可以设置,值越小,混合的速度就越慢,一般都设置为3左右即可。
在动画蓝图的动画图标中创建一个动画机,然后双击动画机进入
将刚才创建好的混合空间拖拽上来,将Entry链接到此处。保存,即可发现右侧预览动画为默认idle状态。
这样无法切换当前的速度,所以,我们需要创建一个新的状态。
右键点击添加状态,即可创建一个新的状态,然后双击进入。
这样,我们就可以通过设置数值,实现数值实现动画切换。
如何修改这个值呢,首先我们将其提升为变量。
提升完成后,左侧变量会显示当前值,值的前面也会出现一个引脚,用于传递变量的值。
我们要在事件图表里面首先判断当前这个蓝图是否有使用者,使用Is Valid节点进行判断,如果有,则从Pawn拥有者身上获取到速度,但是获取的速度是一个三维向量(黄色的按钮),所以,我们还需要获取向量的长度,然后设置即可。
接下来,在角色蓝图里面,选中网格体,在右侧动画类里设置当前创建的动画蓝图,即可实现当前角色的移动动画。
实现角色走路跑步和冲刺
右键蓝图,创建一个枚举。
点击上面的添加枚举器,增加三个枚举,用于记录当前的状态。个人推荐枚举的命名前缀加上Enum。
在蓝图类中创建一个变量,用于记录移动状态
在右侧修改变量类型,搜索枚举名称,设置当前变量类型。
设置变量默认值为Run,需要先编译。
接下来要实现当前变量的判断,然后根据变量的值进行角色的速度修改,这里通过创建一个通用的函数,来实现复用。
首先点击加号,创建一个函数
在函数内,对枚举进行判断,可以使用switch节点,然后创建一个Speed变量,将变量类型修改为浮点数。switch节点可以根据不同的状态去设置不同的变量的值,接着添加一个返回节点,并将最后的值返回出去,这样就书写完成了一个函数。
接下来要去调用这个函数,为了快速实现,现在使用一种比较耗费性能的方法,每一帧去判断。
然后将左侧的角色移动拖拽下来,找到设置最大速度 设置 Max Walk Speed,来实现速度的设置。
最终链接如上。
接着我们要实现状态枚举的变量的修改,那就简单了,之前我们已经写好了ctrl和shift键的触发。
使用这两个键实现状态修改。
当前键位按下时,修改成目标移动状态,抬起时修改成默认状态,即可实现移动状态的切换。
实现跳跃
首先在输入列表添加跳跃按键,然后链接跳跃事件。
这样就实现了跳跃,只是没有动画。
创建一个设置跳跃的动画和高度的函数。
首先是高度的设置,我们要去修改角色移动的跳跃的Z速度。
在函数内这样设置。
根据不同的移动速度,设置不同的跳跃高度。
接下来我们使用蒙太奇播放去播放不同的跳跃动画。
为了方便修改蒙太奇播放资产,我们把资产节点提升为变量,方便修改。
为了方便每个角色修改,将蒙太奇使用的资产提升,可以在函数外设置,相当于增加了函数值。
播放为了防止角色位置发生偏移,我们需要启用根节点运动,保证角色在设置的位置播放动画。如果本身就是根节点运动的,就不要再设置了,我发现我强制启用了根运动,角色会原地跳跃。
在动画的文件右键,创建蒙太奇动画。
接下来,我们要创建插槽,插槽可以让我们知道创建的是什么蒙太奇动画。
右侧会出现动画插槽列表。
点击添加插槽,创建一个jump的插槽
设置完成之后,选择刚才设置好的插槽。
在之前设置的地方直接改为调用函数
将跳跃触发修改到蒙太奇播放的后面。
创建了插槽,还需要使用,现在直接测试
创建完成插槽,记得在右侧将插槽修改为Jump插槽。
插槽就是为了,在播放蒙太奇的动画时,我们可以选择在何时进行混合。
为了防止角色能够一直跳跃,我们使用一个变量判断,然后再跳跃完成落地后,让角色可以再次跳跃。
在跳跃后,将变量设置为false,分支节点可以通过if去得到
然后函数调用完成,延迟一秒再将变量设置为true,即可以再次跳跃。
实现多段跳,可以在类默认值里面找到跳跃最大数量去设置。
坠落动画实现
在基础状态机里面,移动右侧新加一个状态,坠落取名Fall,再从Fall节点拉出一个箭头返回Walk,形成闭环。
在左侧创建一个变量用于判断当前是否在空中。
然后再动画图表里面从拥有者身上获取移动组件,从里面获取是否正在掉落。
将值设置给变量,有了变量,我们可以在状态机切换里面去设置状态切换。
双击切换,即可进入
将变量设置给结果,如果值为True,则可以从移动切换到掉落动画。
我们还需要设置切换回去的,就是另外一个切换箭头,进入将变量取反,如果不在空间,那么,结果将为true。
然后进入Fall状态,在右面找到坠落动画,输出动画姿势,即可实现掉落效果。
如果感觉过渡动画的时长有点卡顿,可以手动调节两个状态动画过渡的时长。
注意这两个,and是并集,not是交集,右键输入 and 布尔 能找到AND节点,右键输入not 布尔 能找到NOT节点
角色蓝图和动画蓝图之间数据传递
在角色蓝图中获取动画实例
动画实例是在角色网格体上的,我们可以通过橘色网格体获取动画实例,然后在时间开始运行时,判断类型是否正确,将类型转换为目标动画类型,并将获得的结果提升为变量,这样可以在角色蓝图中的事件图表中的任何位置使用当前蓝图设置角色中的相关属性。
前面切换跳跃其实我们使用的是蒙太奇实现的,但我看库里面的角色制作是通过状态机切换,这里说一下思路,从行走跳跃后,就进入的浮空状态,就先播放了一下跳跃动画,动画不循环,完成后,直接切换到浮空,如果不是悬浮状态了,直接切换到移动状态。
移动地面摩擦力
通过这两个值,我们可以模拟不同的地面的质感。