目录
效果
步骤
一、项目准备
-
新建一个空白工程,创建一个Basic关卡,添加第三人称游戏资源到内容浏览器
-
在插件中启用"Water"插件
重启后点击"将项目条目添加到DefaultEngine.ini"
- 在场景中删除Floor
激活地形模式
分段大小选择"15x15四边形",然后点击创建
回到选项模式,将"Water Body Lake"拖入场景中
设置"WaterBodyLake"的碰撞预设为"WaterBodyCollsion"
- 在Mixamo网站上选择要下载的角色下载
分别下载Idle、Runing、Swimming、Treading4个状态的动画
- 将下载的资源导入UE,先导入角色
导入4个动画
不勾选"导入网格体"选项,然后点击导入所有
导入完成后资产如下:
二、控制角色移动
- 选中骨骼,然后创建混合空间1D
这里命名为"BS1D_Idle_Run",表示站立和跑步的混合
打开"BS1D_Char_Loco",更改水平坐标名称为Speed,最小轴值设为0,最大轴值设为200,权重速度设为4
将站立的动画放在坐标最左边,将跑步的动画放在最右边
此时我们可以按住Ctrl然后滑动鼠标来调整预览点,观察速度发生改变时,角色的动画变化:
- 继续选中角色骨骼,再创建一个混合空间1D,这里命名为"BS1D_Tread_Swim",表示在水中浮动和游泳的混合
打开"BS1D_Tread_Swim",水平坐标名称设置为"Speed",最大轴值为300,权重速度为4
将水中漂浮的动画放在最左边,将游泳的动画放在最右边
如果我们感觉游泳的动作太慢了,我们可以双击游泳动画来打开资产详情
将比率范围由1改为2
- 选中骨骼,创建动画蓝图
这里命名为"ABP_Character"
打开"ABP_Character",在事件蓝图开始播放时获取到第三人称角色蓝图的引用
将第三人称角色蓝图的引用转换为有效的Get
在事件蓝图更新动画时获取有效的第三人称角色引用,将第三人称角色的速度提升为变量,变量命名为"Speed"
在动画图表中将变量"Speed"传给混合空间1D"BS1D_Idle_Run",然后输出姿势
- 打开第三人称角色蓝图"BP_ThirdPersonCharacter"
先选中"网格体"组件,然后在细节面板中将骨骼网格体资产替换为我们下载的角色的骨骼网格体
动画类选择我们创建的动画蓝图"ABP_Character"
我们可以将弹簧臂组件往上偏移一点
- 在世界场景设置中修改游戏模式重载为"BP_ThirdPersonGameMode"
此时运行游戏已经可以看到控制角色移动了:
三、控制角色游泳
- 新建一个蓝图接口,这里命名为"BPI_Swiming"
打开"BPI_Swiming",添加两个新函数,这里命名为"EnterWater"和"ExitWater"
- 选中大纲中的"WaterBodyLake",创建父类为Actor的蓝图
蓝图命名为"BP_WaterBodyLake"
在蓝图"BP_WaterBodyLake"的事件图表中,当Actor与水体开始/结束重叠时,就通知目标执行蓝图接口函数"Enter/Exit Water"
- 打开第三人称角色蓝图"BP_ThirdPersonCharacter",在类设置中,添加蓝图接口"BPI_Swiming"
在事件图表中去实现"Enter Water"和"Exit Water"的具体逻辑
添加一个布尔类型变量,命名为"IsInWater",用于表示此时角色是否在水体中
当进入水体时,设置"IsInWater"为True,离开水体时设置为False
添加一个浮点型变量,命名为"WaterDepthZ",用于表示水深
当角色进入水体后设置一下水体深度为此时玩家位置的Z值
继续添加如下节点
每一帧都先判断此时玩家是否处于水体中,如果处于水体,就判断此时水位是否超过角色半高,
如果超过半高,就设置物理体积为水体积,设置运行模式为游泳
如果没超过半高,就判断水位是否低于角色半高
如果低于半高就取消水体积设置,运动模式切换回行走
选中"角色移动组件",在细节面板中设置制动游泳速度为500
- 打开动画蓝图"ABP_Character",在事件图表中获取此时角色是否处于游泳状态。将"正在游泳"节点的返回值提升为变量,命名为"IsSwimming"。
在动画图表中添加如下节点
此时运行游戏,效果如下,角色可以在水中游泳,但是在水中漂浮时的浮力位置不对
- 打开角色在水面漂浮的动画序列"Treading_Water"
修改导入平移,然后点击重新导入动画
可以看到运行游戏后,角色在水中漂浮的位置就是正确的
四、实现角色潜水、上浮
- 复制一份输入映射"IA_Move" ,这里命名为"IA_SwimmingUp"
设置值类型为"数字(布尔)"
再复制一份,命名为"IA_SwimmingDown"
- 打开"IMC_Default"
添加两个映射
- 打开第三人称角色蓝图"BP_ThirdPersonCharacter",在事件图表中添加如下节点
此时运行游戏可以看到我们就可以通过键盘1键控制角色下沉,0键控制角色上浮。但是出现了一个问题就是当角色已经漂浮在水面上时,我们再按下0键,角色还会不断向上移动,这显然不符合实际,因此我们需要继续解决这个问题。
五、解决在水面上浮的Bug
- 打开骨骼"Ch02_nonPBR_Skeleton"
找到骨骼"Neck"
添加一个插槽
切换到后视图调整一下插槽位置
- 打开项目设置,搜索"channel",点击"新建检测通道"
通道命名为"Swimming",默认响应为"Ignore"
- 回到第三人称角色蓝图"BP_ThirdPersonCharacter",在事件图表中添加如下节点,表示每帧从"Neck插槽"位置向上发出长度为50cm的射线
- 打开水体蓝图"BP_WaterBodyLake",碰撞预设设置为"Custom",通道"Swimming"的碰撞响应设置为阻挡
此时运行游戏效果如下,红线表示没有检测到与水体的碰撞,绿线表示检测到了
- 回到"BP_ThirdPersonCharacter",关闭射线检测的线条绘制效果
添加一个布尔类型的变量,这里命名为"CanSwimmingUp",表示此时角色是否能够上浮
如果检测到了水体就表示此时可以上浮,否则不可以上浮
然后我们就可以根据变量"CanSwimmingUp"的结果来作为角色上浮的限制条件
最终效果如下
参考视频: