第一部分-主角控制 链接:桃芙:UE4蓝图学习笔记1-Open World game CodeLikeMe
Open World game CodeLikeMe 第一部分——第三人称游戏角色战斗
45集、46集、48-50集、52集——近战战斗
一、对战对象-AI npc
1.使主角蓝图成为CH_Human子蓝图类:
以CH_Human创建一个子类蓝图CH_Player,删除CH_Human中的SpringArm和Camera。 在世界场景设置中,将CH_Player作为默认pawn类。
2. 新建蓝图类AI_Human,类型为detourcrowdAIcontroller,在CH_Human(self)的细节-Pawn-AI控制器类中选择AI_Human。将CH_Human拉入场景中。
3. 增加寻路网格:
将导航网格体边界体积放入场景中,xyz方向均放大若干倍。(按P键可使导航网格覆盖区域可见)
4. 使npc随机移动:
(1)新建接口蓝图BPI_AI,接口函数名GoToLocation,输入变量target location为向量型。
(2)GoToLocation输出端:在AI_Human的类设置中增加BPI_AI,并放入GoToLocation函数事件,执行AI move to 功能,调节半径。将GoToLocation函数输出的target location向量进行“获取半径内可抵达的随机点处理”,调整半径,再作为AI move to 的目标位置。
(3)当AI move to失败时,delay 2s,再次进行AI move to。
(4)GoToLocation输入端:Begin Play时,执行GoToLocation。target location输入值为该actor位置半径内可抵达的随机点,调节半径。同时,若AI move to执行成功,则再次执行GoToLocation从而前往下一个随机位置。
5. 增加npc移动动作——走、蹲伏
(1)在AI_Human内,将get controlled pawn的输出提升为变量Ch,Begin Play时,先将get controlled pawn赋给Ch,再执行GoToLocation。
(2)在AI_Human内,获取Ch作为ToggleRun和ToggleCrouch的目标。在执行GoToLocation后,以随机布尔值作为判断,分别执行ToggleCrouch和ToggleRun,并将该随机布尔值作为两个函数的布尔输入。
二、设置以npc为中心的动态导航网格
- 在项目设置-导航系统中,勾选仅在导航触发器周围生成导航
2. 将之前放置的NavMeshBoundsVolume放大覆盖整个世界地图
3.为CH_Human新建子类蓝图CH_NPC,去掉CH_Human中的AI控制器,转移给CH_NPC,并给CH_NPC增加导航触发器组件。最后将场景中的CH_Human替换为CH_NPC。
三、佩戴与拔出武器
1.武器佩戴与挂点
(1)在CH_Human的骨骼中,于肩部骨骼处增加一个插槽,命名为Sword1Socket;于右手骨骼上增加插槽,命名为SwordInHandSocket。
(2)在CH_Human的mesh层下,增加两个Scene组件,分别命名为SwordStrap和HandSocket,分别在细节的socket选择Sword1Socket和SwordInHandSocket。
(3)导入外部武器资源,先后放在SwordStrap和HandSocket下,调整武器本身大小,再将武器在scene下时调节Scene的位置、旋转,使武器在位置和旋转都为0,0,0时分别能正常显示在肩膀后和手中。最后将武器默认放在SwordStrap下。
2.拔剑动作:
(1)导入外部拔剑动作资源,为其建立蒙太奇文件.
(2)在项目设置-input中,增加操作映射ToggleSword,关联键盘按键1.
(3)在CH_Human中,增加Fight图表,获取ToggleSword输入事件。新增默认为false的bool值SwordEquiped,当ToggleSword输入发生时,将SwordEquiped取非赋给SwordEquiped,再作为判断条件:
a. 若为true,则播放拔剑动作蒙太奇,delay若干s(到动画拔剑时刻),执行Attach To Component,将武器作为对象,HandSocket作为parent,位置、旋转、缩放都选择保持场景,再执行move component to, component为武器。
b. 若为false,同样播放拔剑动作蒙太奇,delay,执行Attach To Component,move component to, 但SwordStrap作为parent。
四、动作融合
1. 在拔剑动画蒙太奇中新增一个slot,命名为UpperBody,将拔剑动作设定给UpperBody。
2. 在BPA_Human中,增加关联UpperBody的slot。在原本的DefaultSlot后连接“新保存的缓存姿势”节点Pose_Default。
增加2个关联Pose_Default的"使用缓存姿势"节点,一个输出给“每个骨骼的分层混合”的base pose,另一个连接到UpperBody,再输出给“每个骨骼的分层混合”的blend pose0.将混合结果输出给最终动画Pose。
3.在角色骨骼上找到整个上半身的根节点,记录其名字。在“每个骨骼的分层混合”细节中的层设置-分支过滤中增加元素,将上半身名字放入。
五、攻击动作
1. 导入外部攻击动作1资源,建立蒙太奇,放在default slot中。在是项目设置中增加新操作映射Attack,关联鼠标左键。
2.将CH_Human中原来输入事件ToggleSword pressed后的执行节点折叠成宏ToggleSword_M ,在宏中增加对于输出节点的连接。
3. 在CH_Human中,获取Attack输入事件,当pressed时,获取变量Sword Equipped作为判断条件,当true时,播放攻击动画蒙太奇;当false时,执行ToggleSword_M,输入使用默认值true,再执行播放攻击动画蒙太奇。
4. 调整攻击动画蒙太奇的播放速度,使其表现更自然
5. 多段攻击:导入外部攻击动作2资源,建立动画蒙太奇。在CH_Human中新增int型数据AttackCount,每播放一次攻击动作蒙太奇后,++AttackCount,将播放的蒙太奇动画输入改为选择节点。选择中分别放入2个攻击动作蒙太奇,而将AttackCount除以2取余的结果作为Index输入。
此处我没有找到很好的2个动画,因此用了一个动画的2个蒙太奇片段来完成多段攻击
六、多段攻击优化
1. 仅限时连续点击可进入多段攻击:在CH_Human的Attack输入事件后补充一个do once节点。在原本的++AttackCount后delay若干秒(防止动画未播完时重复攻击动画),序列执行do once的reset和第二个delay(多久后会重置会第一个攻击动画)后设置AttackCount=0。两个delay时间需根据动画细调。
2. 防止2段攻击多次播放:
在播放完动画蒙太奇后,执行switch on int,将AttackCount作为输入,增加2个输出引脚——0时执行原本的++AttackCount路径;1时执行AttackCount=0,delay若干秒后执行do once的reset。