【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

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理 秒杀系统是应对高并发、高压力下的典型业务场景,涉及到并发控制、库存管理、事务管理等多个关键技术点。本文将深入剖析秒杀商品业务中常见的几个核心问题,包括 AOP 事务管理、同步锁机制、乐观锁、CAS 操作,以及用户限购策略。通过这些技术的结合,确保秒杀系统在高并发场景下的稳定性和一致性。 1. AOP 代理对象与事务管理 在秒杀商品

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

BIRT--商业智能和报表工具,从零开始

1.简介 BIRT (Business Intelligence and Reporting Tools), 是为 Web 应用程序开发的基于 Eclipse 的开源报表系统,特别之处在于它是以 Java 和 JavaEE 为基础。BIRT 有两个主要组件:基于 Eclipse 的报表设计器,以及部署到应用服务器上的运行时组件。 2.下载 官网下载网址:http://download.ec