【UE5.2】从零开始控制角色移动、游泳、下潜、上浮

2023-12-14 15:36

本文主要是介绍【UE5.2】从零开始控制角色移动、游泳、下潜、上浮,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

效果

步骤

一、项目准备 

二、控制角色移动 

三、控制角色游泳

四、实现角色潜水、上浮

五、解决在水面上浮的Bug


效果

步骤

一、项目准备 

1. 新建一个空白工程,创建一个Basic关卡,添加第三人称游戏资源到内容浏览器

2. 在插件中启用“Water”插件

重启后点击“将项目条目添加到DefaultEngine.ini”

3. 在场景中删除Floor

激活地形模式

分段大小选择“15x15四边形”,然后点击创建

回到选项模式,将“Water Body Lake”拖入场景中

设置“WaterBodyLake”的碰撞预设为“WaterBodyCollsion”

4. 在Mixamo网站上选择要下载的角色下载

分别下载Idle、Runing、Swimming、Treading4个状态的动画

5. 将下载的资源导入UE,先导入角色

导入4个动画

不勾选“导入网格体”选项,然后点击导入所有

导入完成后资产如下:

二、控制角色移动 

1. 选中骨骼,然后创建混合空间1D

这里命名为“BS1D_Idle_Run”,表示站立和跑步的混合

打开“BS1D_Char_Loco”,更改水平坐标名称为Speed,最小轴值设为0,最大轴值设为200,权重速度设为4

将站立的动画放在坐标最左边,将跑步的动画放在最右边

此时我们可以按住Ctrl然后滑动鼠标来调整预览点,观察速度发生改变时,角色的动画变化:

2. 继续选中角色骨骼,再创建一个混合空间1D,这里命名为“BS1D_Tread_Swim”,表示在水中浮动和游泳的混合

打开“BS1D_Tread_Swim”,水平坐标名称设置为“Speed”,最大轴值为300,权重速度为4

将水中漂浮的动画放在最左边,将游泳的动画放在最右边

如果我们感觉游泳的动作太慢了,我们可以双击游泳动画来打开资产详情

将比率范围由1改为2

3. 选中骨骼,创建动画蓝图

这里命名为“ABP_Character”

打开“ABP_Character”,在事件蓝图开始播放时获取到第三人称角色蓝图的引用

将第三人称角色蓝图的引用转换为有效的Get

在事件蓝图更新动画时获取有效的第三人称角色引用,将第三人称角色的速度提升为变量,变量命名为“Speed”

在动画图表中将变量“Speed”传给混合空间1D“BS1D_Idle_Run”,然后输出姿势

4. 打开第三人称角色蓝图“BP_ThirdPersonCharacter”

先选中“网格体”组件,然后在细节面板中将骨骼网格体资产替换为我们下载的角色的骨骼网格体

动画类选择我们创建的动画蓝图“ABP_Character”

我们可以将弹簧臂组件往上偏移一点

5. 在世界场景设置中修改游戏模式重载为“BP_ThirdPersonGameMode”

此时运行游戏已经可以看到控制角色移动了:

三、控制角色游泳

1. 新建一个蓝图接口,这里命名为“BPI_Swiming”

打开“BPI_Swiming”,添加两个新函数,这里命名为“EnterWater”和“ExitWater”

2. 选中大纲中的“WaterBodyLake”,创建父类为Actor的蓝图

蓝图命名为“BP_WaterBodyLake”

在蓝图“BP_WaterBodyLake”的事件图表中,当Actor与水体开始/结束重叠时,就通知目标执行蓝图接口函数“Enter/Exit Water”

3. 打开第三人称角色蓝图“BP_ThirdPersonCharacter”,在类设置中,添加蓝图接口“BPI_Swiming”

在事件图表中去实现“Enter Water”和“Exit Water”的具体逻辑

添加一个布尔类型变量,命名为“IsInWater”,用于表示此时角色是否在水体中

当进入水体时,设置“IsInWater”为True,离开水体时设置为False

添加一个浮点型变量,命名为“WaterDepthZ”,用于表示水深

当角色进入水体后设置一下水体深度为此时玩家位置的Z值

继续添加如下节点

每一帧都先判断此时玩家是否处于水体中,如果处于水体,就判断此时水位是否超过角色半高,

如果超过半高,就设置物理体积为水体积,设置运行模式为游泳

如果没超过半高,就判断水位是否低于角色半高

如果低于半高就取消水体积设置,运动模式切换回行走

选中“角色移动组件”,在细节面板中设置制动游泳速度为500

4. 打开动画蓝图“ABP_Character”,在事件图表中获取此时角色是否处于游泳状态。将“正在游泳”节点的返回值提升为变量,命名为“IsSwimming”。

在动画图表中添加如下节点

此时运行游戏,效果如下,角色可以在水中游泳,但是在水中漂浮时的浮力位置不对

5. 打开角色在水面漂浮的动画序列“Treading_Water”

修改导入平移,然后点击重新导入动画

可以看到运行游戏后,角色在水中漂浮的位置就是正确的

四、实现角色潜水、上浮

1. 复制一份输入映射“IA_Move” ,这里命名为“IA_SwimmingUp”

设置值类型为“数字(布尔)”

再复制一份,命名为“IA_SwimmingDown”

2. 打开“IMC_Default”

添加两个映射

3. 打开第三人称角色蓝图“BP_ThirdPersonCharacter”,在事件图表中添加如下节点

此时运行游戏可以看到我们就可以通过键盘1键控制角色下沉,0键控制角色上浮。但是出现了一个问题就是当角色已经漂浮在水面上时,我们再按下0键,角色还会不断向上移动,这显然不符合实际,因此我们需要继续解决这个问题。

五、解决在水面上浮的Bug

1. 打开骨骼“Ch02_nonPBR_Skeleton”

找到骨骼“Neck”

添加一个插槽

切换到后视图调整一下插槽位置

2. 打开项目设置,搜索“channel”,点击“新建检测通道”

通道命名为“Swimming”,默认响应为“Ignore”

3. 回到第三人称角色蓝图“BP_ThirdPersonCharacter”,在事件图表中添加如下节点,表示每帧从“Neck插槽”位置向上发出长度为50cm的射线

4. 打开水体蓝图“BP_WaterBodyLake”,碰撞预设设置为“Custom”,通道“Swimming”的碰撞响应设置为阻挡

此时运行游戏效果如下,红线表示没有检测到与水体的碰撞,绿线表示检测到了

5. 回到“BP_ThirdPersonCharacter”,关闭射线检测的线条绘制效果

 

添加一个布尔类型的变量,这里命名为“CanSwimmingUp”,表示此时角色是否能够上浮

如果检测到了水体就表示此时可以上浮,否则不可以上浮

然后我们就可以根据变量“CanSwimmingUp”的结果来作为角色上浮的限制条件

最终效果如下

参考视频:

https://www.bilibili.com/video/BV12N411B7tf/?spm_id_from=333.999.0.0&vd_source=36a3e35639c44bb339f59760641390a8

这篇关于【UE5.2】从零开始控制角色移动、游泳、下潜、上浮的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/493101

相关文章

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程

《双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程》:本文主要介绍如何在Windows11系统中使用VMware17创建虚拟机,并在虚拟机中安装Ubuntu22.04桌面版或Ubunt... 目录一、首先win11中安装vmware17二、磁盘分区三、保存四、使用虚拟机进行系统安装五、遇见的错误和解决

使用FileChannel实现文件的复制和移动方式

《使用FileChannel实现文件的复制和移动方式》:本文主要介绍使用FileChannel实现文件的复制和移动方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录使用 FileChannel 实现文件复制代码解释使用 FileChannel 实现文件移动代码解释

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络