【ue5】滑铲系统蓝图笔记

大致逻辑如下:

一、导入动画

  • 滑铲
  • 蹲待机
  • 蹲行走

导入到文件夹中

可以右键设置颜色,便于区分。

二、调整动画

1.启动根运动

启动根运动后,人物才可以位移,不然只能在原地。

打开动画序列,勾选启用根运动Enabled root motion.

2.创建蒙太奇

对动画序列右键创建动画蒙太奇,用户释放技能时播放。

3.调整蒙太奇

因为我们要延长滑铲的时间,现在我们的滑铲蒙太奇是滑铲后站起来,但是我们只需要滑铲这个动作。

找到刚刚开始滑铲的时间,调整蒙太奇结束时间=0.71。现在我们的末尾动作就是滑铲。

4.设置循环

现在你可以看到人物一直滑铲后站起来再继续滑铲。

右键新建一个蒙太奇片段Create New Montage,名字为"循环"。

将"循环"拖拽到滑铲结尾,并勾选"循环"。现在人物滑铲后就停住了。

三、条件判断

打开人物蓝图

1.设置按键

Ue5改版后,需要新建一个操作输入。并命名为IA_Sliding。


在默认输入映射情境中选择我们刚才创建IA_Sliding,并将输入键设置为C。

2.当人物速度>200时,才可滑铲。

Slide输入键------获取角色移动Get CharacterMovement------获取速度Get Velocity------获取向量长度Vector Length------>200

接下来判断,当玩家正在掉落时或者滑铲时,不能触发。

1.正在掉落

获取角色移动Get CharacterMovement------正在掉落is falling

2.正在滑铲

网格体Get Mesh------获取动画实例Get Animin Instance------蒙太奇正在播放Montage is playing

使用"与门"And布尔值叠加。

3.是否滑铲?

创建一个布尔变量"滑铲?"。

4.播放蒙太奇

创建一个序列Sequence------序列0

设置正在滑铲=真。

设置通过网格体获取动画实例------播放蒙太奇Montage Play,选取上面创建好的滑铲蒙太奇。

四、缩放胶囊体

虽然现在我们已经可以位移了,但是如果不调整胶囊体,你会发现腿部动作形变得很厉害。

通过时间轴来缩放胶囊体。

1.创建时间轴

序列1------添加时间轴Add Timeline,命名"缩放胶囊体"。

打开时间轴,添加浮点型轨道,命名为"值",长度=0.2

右键创建两个关键帧:

第一个关键帧:时间=0,值=0;

第二个关键帧:时间=0.2,值=1;

2.设置胶囊体大小

将时间轴的开始执行引脚改为Play from start。

胶囊体组件Get capsual component------设置胶囊体半高Set capsual half height------通过插值Lerp,将胶囊体半高变化设置在35-90之间。(平滑过度)

胶囊体大小在细节面板中看。

3.胶囊体随着滑铲缩小

网格体------设置相对位置Set relevant location

在视口中点击网格体,将动画模式改为使用动画资产,选取滑铲蒙太奇。

将胶囊体半高改为35,调整网格体的腿与胶囊体最下方对齐。

还原胶囊体高度和动画。

将两个高度数值填入相对位置的插值,作为胶囊体移动的高度变化范围。

4.起身胶囊体恢复

在时间线前加一个事件。

创建自定义事件"反转胶囊体"------通过"角色移动"判断是否处于蹲伏状态------未蹲时,反转时间线timeline(即胶囊体恢复为90)

五、滑铲时是否在地板上

通过玩家手部胶囊体检测判断人物是否与地板对齐。

通过胶囊体检测玩家滑铲时是否在地面上,如果掉落则停止滑铲、停止播放滑铲动作。

1.滑铲检测事件

添加一个序列,用于检测玩家是否处于滑铲中。

创建一个自定义事件"滑铲时检测地板"------以事件设置定时器set timer by event,time设置为0.01,勾选循环looping(每0.01秒运行一次)------新建序列。

2.创建宏进行检测

创建宏Macros:检测玩家是否在地板上------滑铲时手在地板上、是否掉落。

按通道进行胶囊体追踪Capsule trace by channel------获取网格体的世界位置作为检测起始点,检测半径和半高作为输入

检测半径默认值设为4,检测半高默认值设为18.

当检测不到时,即滑铲停止------停止播放蒙太奇动画------输出

Blend out Time作为输入值,默认值为0.2.

完整如下:

3.滑铲停止

将定时器返回值提升为变量"滑铲追踪句柄"。

将宏拖入并连接序列0------地板检测结束后------通过滑铲追踪句柄使定时器失效(重置定时器)。

整理一下:开始滑铲检测地板事件后,每0.01s检测一次玩家是否在滑铲,若未检测到碰撞(地板),则玩家不处于滑铲状态、停止播放滑铲动画蒙太奇、停止检测。

六、玩家与地板对齐

找到与当前地板的旋转值,通过插值平滑地将玩家对齐。

1.创建宏玩家对齐地板

在宏中设置Actor旋转set Actor rotation。

设置new rotation旋转参数。

角色运动character movement------获得当前地板信息get current floor------中断Finding Floor result------中断hit result------impact normal地板法线作为"利用zx轴旋转Make Rot From ZX"的Z轴,获取玩家向前向量Get Actor forward vector作为X轴。

使用"R插值到RInterp to"创建平滑旋转:从玩家当前旋转角度,转到地板的平行角度,时间为场景差量Get world delta seconds(同步游戏时间),旋转速度Interp Speed作为输入值设为5.


完整如下:

大致思路:通过玩家向前向量,和垂直地板向量,找到地板的角度,让玩家旋转到与地板平行。

2.触发对齐

序列1------执行宏

七、滑铲时是否与物体碰撞

避免滑铲时穿墙,对滑铲时最前面的脚进行球体检测,如果碰到墙,则停止滑行

1.创建宏进行球体检测

创建宏"检测玩家滑动时碰撞表面"。

输入------按通道进行球体追踪

检测点:获取骨骼的插槽位置,插槽名为脚部的骨骼名ball_I------"+"向量相加函数,分割相加向量的结构体引脚,将Z向量作为输入,保持为0(可自行输入数值进行调试)

排除检测数组:将地板检测的那一段复制过来,将地面排除检测。

将检测半径作为输入,默认值=20

2.条件判断

是否击中:检测的返回值若为"真",则进行下一个判断。

击中的物体是否与地面垂直:中断检测的命中结果(out hit)------获取法线向量(Impact Normal)------乘以向量(0,0,1)"dot product"------反余弦Acos degree------获取绝对值------若击中角度>80------输出

将对比角度作为输入,默认值80

3.调用宏

序列2连接宏"检测玩家滑铲时碰撞表面"------将上面的使定时器失效复制过来。

完整如下:

4.调试

为了便于调试,将球体检测的Draw Debug Type作为输入。

在宏界面选择类型:针对一帧For One Frame

滑铲时就可以看到脚部的运动轨迹。

滑铲的蓝图就建好了,全选后右键添加注释"滑铲"。

八、是否持续滑铲

在这里完成两个逻辑:

  1. 停止滑铲
  2. 当玩家在斜坡上滑动时,可以持续滑动完整个斜坡。

通过与地板的角度判断是否继续滑铲。角度确定,继续滑行,否则起身。

1.建立蒙太奇通知

通知notify:通过动画调用动画蓝图,在动画蓝图中调用角色蓝图。

滑铲动画快结束时通过蒙太奇通知在动画蓝图中计算速度、调用角色蓝图进行判定是否继续滑铲。

创建"当前滑动速度"向量。

打开滑铲蒙太奇动画------添加一个通知轨道

在轨道中新建通知Notify"计算速度",并将该通知放在最后一帧前面。

然后再新建一个通知"查看是否滑铲",将该通知放在最后一帧。

2.设置滑动速度

打开动画蓝图的事件图表------新建"AnimNotify_计算速度"事件

将"预览实例"改为"未选中调试对象"(不知道有什么用)。

获取角色的character movement------get velocity------set 当前滑动速度,滑动速度=当前角色速度

在人物蓝图中新建一个自定义事件"检查是否继续滑铲"。

是否继续滑铲=是否滑铲。

在动画蓝图中,新建"AnimNotify_查看是否滑铲"事件------调用刚才创建的事件"检查是否继续滑铲"。

3.检测地面角度函数

创建函数"寻找当前楼层角度和方向"------返回节点return node,将对齐地板宏中的中断floor结果那一段复制过来。

中断命中结果的normal与向量(0,0,1)相乘------获取逆角度,作为返回节点的"角度"输出值。

Normal作为X旋转轴,向前向量作为Y轴,利用XY创建旋转Make rot from XY------分割返回值引脚,X轴的返回值*Y轴返回值------乘积>0,是否向上倾斜Is slope up=真,作为返回节点输出值。

4.是否继续滑铲事件

回到角色蓝图,继续写之前的"检查是否继续滑铲事件"。

检查是否继续滑铲事件------正在滑铲为真------调用寻找当前楼层角度和方向函数。

是否向上倾斜=真,斜坡------设置角色移动速度=当前滑动速度,当前滑动速度在动画蓝图中已经设置过,即滑铲结束时的速度------ 以函数名设置定时器,每0.001s循环"继续滑铲"事件(在后面写),返回值提升为变量"继续滑铲句柄"------调用寻找当前楼层角度和方向函数,当前角度提升为变量。

复制一个滑铲蒙太奇,删掉通知1、2,将开始时间设为滑铲开始0.71s,结束时间设置为站起来1.53s。这样就是一个倒放的滑铲动画,玩家从滑铲起身。
注意:"选取下一个片段"不要选循环,不然会一直重复播放。

是否向上倾斜=假,平地------播放滑铲起身动画自定义事件------播放滑铲起身蒙太奇------延迟0.02s------序列

序列0------滑动追踪句柄是否有效Is valid------为真,使句柄无效,停止地板检测。

序列1------翻转胶囊体事件。

完整如下:

5.继续滑铲事件

  • 平地,速度不够时停止
  • 斜坡,加速

继续滑铲自定义事件------调用寻找当前楼层角度和方向函数,当前角度=角度------将F插值于Finterp to(平滑过度),当前=当前角度、目标=角度、delta time=获取场景差量Get world Delta seconds、Interp speed=0.4------判定插值后的角度<3?

角度<3,平地------创建变量"停止滑铲速度",默认值50------角色速度<停止滑铲速度时,清除继续滑铲句柄,播放起身动画。

角度>=3,斜坡------序列

序列0------获取Actor旋转,获取向前向量。分割这两个结构引脚,Z轴相连------添加移动输入,世界方向=Z轴方向------设置最大滑铲速度=1500------设置最大滑铲加速度=500

序列1------检测玩家滑铲时碰撞表面宏------为真,撞墙------清除继续滑铲句柄

完整如下:

是否持续滑铲整个蓝图如下:

6.滑铲后重置旋转

滑铲后重置旋转,让玩家面对正前方。

自定义事件"重置旋转体"------获取Actor旋转Get Actor Rotation,提升返回值引脚,将Z轴"创建旋转体Create Rotator",将旋转体的返回值提升为变量"默认轴旋转Defualt Yaw rotaion"------复制胶囊体的时间轴改名为"重置滑铲旋转",旋转体连接时间轴的play from start

时间轴的update------设置Actor旋转,new rotation拉出新建"插值(旋转体)Lerp"------Lerp的alpha连接胶囊体的"值",A连接获取Actor旋转,B连接变量"默认轴旋转"。

复制滑铲时设置速度和加速度,最大行走速度=500,最大加速度=1500------胶囊体finished连接

完整如下:

在"检查继续滑铲"事件的播放起身动画新增一个序列------调用"重置XY旋转"事件。

九、调整

在滑铲的"滑动时检测地板"的"地板检测"------判定"继续滑铲"句柄是否有效Is valid?

为真:清除继续滑铲句柄------翻转胶囊体------重置XY旋转

为假:翻转胶囊体------重置XY旋转

玩家在空中,则停止滑铲。

在检测玩家滑铲时碰撞表面------播放滑铲起身动画(玩家踢中物体则站起来)

十、滑铲结束时下蹲

当头顶空间不够时,玩家滑铲结束后要进入下蹲状态。

1.动画通知

在滑铲结束蒙太奇的第1帧添加通知"检查天花板"。

在人物蓝图中新建自定义事件"天花板追踪"

在动画蓝图中调用通知"检查天花板"------调用人物蓝图的"天花板追踪"事件。

2.下蹲

天花板追踪------按通道进行胶囊体追踪,起点和终点都=当前位置+70(z),半径=34,高度=50,trace channel=可见,actors to ignore=创建数组make array,draw debug type=每帧时长------如果检测到物体------判定character movement的is crouching正在蹲伏

创建"天花板追踪?"变量。

天花板追踪=真------解除蹲伏un crouching------天花板追踪=假

天花板追踪=假------蹲伏is crouching------将"滑铲"逻辑中的获取动画实例复制过来,停止蒙太奇stop montage,in blend out time=0.2------天花板追踪=真

完整如下:

3.创建动画混合空间

创建动画>旧有>混合空间1D"下蹲_BS"

打开混合空间,水平坐标名称改为"速度"、最大速度=150。

将下蹲待机动画拖到第一帧,下蹲行走动画拖到最后一帧。

在人物蓝图>视口中点击角色移动chracter movement,在细节中修改:

可下蹲=true,最大蹲伏行走速度=150 cm/s

4.调整动画蓝图

在动画蓝图中,找到已有的蓝图。

Movement Component------正在蹲伏Is Crouching,提升为变量"是否正在蹲伏?"

在Locomotion状态机中创建按布尔混合姿势Blend pose by bool:

真姿势=下蹲混合动作、速度=ground speed;

假姿势=locomotion;

Active value=是否正在蹲伏?

滑铲结束后,头顶有东西则下蹲。

5.退出下蹲状态

在原有蓝图Movement Input的最后面------若天花板追踪=真------调用天花板追踪事件。

头顶无障碍自动站起。

相关推荐
Aileen_0v04 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper
ue星空5 小时前
UE5材质系统之PBR材质
ue5·材质
Rinai_R5 小时前
计算机组成原理的学习笔记(7)-- 存储器·其二 容量扩展/多模块存储系统/外存/Cache/虚拟存储器
笔记·物联网·学习
吃着火锅x唱着歌5 小时前
PHP7内核剖析 学习笔记 第四章 内存管理(1)
android·笔记·学习
ragnwang5 小时前
C++ Eigen常见的高级用法 [学习笔记]
c++·笔记·学习
胡西风_foxww6 小时前
【es6复习笔记】rest参数(7)
前端·笔记·es6·参数·rest
胡西风_foxww9 小时前
【es6复习笔记】函数参数的默认值(6)
javascript·笔记·es6·参数·函数·默认值
胡西风_foxww9 小时前
【es6复习笔记】生成器(11)
javascript·笔记·es6·实例·生成器·函数·gen
waterme1onY9 小时前
Spring AOP 中记录日志
java·开发语言·笔记·后端
2401_8791036810 小时前
24.12.25 AOP
java·开发语言·笔记