UE5 实现RPG游戏操作控制

在UE5以后,epic抛弃了之前的那一套操作输入系统,使用了一套新的增强输入作为替代,目的主要是解决经常切换操作时的问题(操作人物上车以后,可以直接切换成操作汽车的一套输入)接下来,将实现如何使用增强输入实现对角色的操作。

这里讲解一下如何实现通过操作控制角色移动

增强输入

在这里插入图片描述
首先创建一个输入操作,命名为IA_Move(IA是Input Action的简写)
在这里插入图片描述
然后将值的类型修改为二维值,角色的移动方向分为两个轴。
在这里插入图片描述
接下来创建一个输入映射情境,命名为IMC_Hero,我们给角色使用的就是输入映射情境,来实现操作的触发,切换操作也是通过切换不同的输入映射情境实现的。
在这里插入图片描述
接下来添加之前设置的映射输入,绑定按键,用来修改之前设置的输入操作的值。

运行逻辑就清晰了,角色绑定输入映射情境,输入映射情境去修改输入操作的值,输入操作的值去触发事件。
这里就简单介绍一下增强输入,如果想继续理解,请点击这里unreal 5.1 增强输入实现

角色控制器

角色控制器是用来处理玩家操作的角色逻辑的一个类。
在这里插入图片描述
首先创建一个类,继承玩家控制器。

PlayerControllerBase.h

// 版权归暮志未晚所有。

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "PlayerControllerBase.generated.h"

class UInputMappingContext;
class UInputAction;
struct FInputActionValue;

/**
 * 
 */
UCLASS()
class AURA_API APlayerControllerBase : public APlayerController
{
	GENERATED_BODY()

public:
	APlayerControllerBase();

protected:
	virtual void BeginPlay() override; //游戏开始时触发
	virtual void SetupInputComponent() override; //在生成输入组件时触发

private:
	UPROPERTY(EditAnywhere, Category="Input")
	TObjectPtr<UInputMappingContext> CharacterContext;

	UPROPERTY(EditAnywhere, Category="Input")
	TObjectPtr<UInputAction> MoveAction;

	void Move(const struct FInputActionValue& InputActionValue);
};

在类里面,创建了连个配置项,分别放置输入操作情境和移动的输入操作的配置项,并创建一个触发按键后的移动回调函数。

PlayerControllerBase.cpp

// 版权归暮志未晚所有。


#include "Player/PlayerControllerBase.h"
#include "EnhancedInputSubsystems.h"
#include "EnhancedInputComponent.h"

APlayerControllerBase::APlayerControllerBase()
{
	bReplicates = true; //是否将数据传送服务器更新
}

void APlayerControllerBase::BeginPlay()
{
	Super::BeginPlay();
	check(CharacterContext); //判断是否存在

	//从本地角色身上获取到它的子系统
	UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer());
	check(Subsystem); //检查子系统是否存在
	Subsystem->AddMappingContext(CharacterContext, 0); //可以存在多个操作映射,根据优先级触发

	bShowMouseCursor = true; //游戏中是否显示鼠标光标
	DefaultMouseCursor = EMouseCursor::Default; //鼠标光标的样式

	FInputModeGameAndUI InputModeData;
	InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock); //将鼠标锁定在视口内
	InputModeData.SetHideCursorDuringCapture(false); //鼠标被捕获时是否隐藏
	SetInputMode(InputModeData); //设置给控制器
}

void APlayerControllerBase::SetupInputComponent()
{
	Super::SetupInputComponent();

	UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(InputComponent); //获取到增强输入组件

	EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &APlayerControllerBase::Move); //绑定移动事件
}

void APlayerControllerBase::Move(const FInputActionValue& InputActionValue)
{
	const FVector2D InputAxisVector = InputActionValue.Get<FVector2D>(); //获取输入操作的2维向量值
	const FRotator Rotation = GetControlRotation(); //获取控制器旋转
	const FRotator YawRotation(0.f, Rotation.Yaw, 0.f); //通过控制器的垂直朝向创建一个旋转值,忽略上下朝向和左右朝向

	const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); //获取世界坐标系下向前的值,-1到1
	const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); //获取世界坐标系下向右的值,-1到1

	if(APawn* ControlledPawn = GetPawn<APawn>())
	{
		ControlledPawn->AddMovementInput(ForwardDirection, InputAxisVector.Y);
		ControlledPawn->AddMovementInput(RightDirection, InputAxisVector.X);
	}
}

在cpp文件内,游戏开始运行时,判断输入映射情境是否存在(防止报错),获取角色的子系统,并将我们设置的输入映射情境添加到角色子系统中。然后设置鼠标在多种情况下的逻辑处理。

在初始输入控制器,获取到输入组件,并绑定输入操作。

Move函数内,我们将获取到控制器的向前和向右的朝向,并根据按的上下左右键,去修改移动。
在这里插入图片描述
接着选择创建蓝图,找到我们创建的类,创建蓝图类。
在这里插入图片描述
如果在细节这里出现可以设置输入映射情境和移动的输入操作选项,证明我们制作成功。
到这里,角色控制器制作完成。

游戏模式

游戏模式可以让我们确定游戏的玩法,使用的角色以及一些游戏内的内容。
在这里插入图片描述
首先创建一个c++类,如果后续有修改,可以直接在这个类里面添加代码。
在这里插入图片描述
接着基于此类创建一个蓝图类
在这里插入图片描述
在右侧细节处,将玩家控制器类和默认pawn类修改成需要使用的。设置完成记得编译。
在这里插入图片描述
在地图右侧世界场景设置中,将游戏模式修改成创建的蓝图类。

玩家出生点

设置好游戏模式,如何确定玩家在场景的什么位置生成,所以,我们需要在场景中添加一个玩家出生点
在这里插入图片描述
可以按住按钮拖入到场景中的某个位置,也可以点击生成,然后再调整位置和朝向。

角色蓝图类

在之前的文章中,我制作了角色类并创建了它的动画蓝图,如过需要查看:
UE5 使用代码开发UE设置,以及创建基于类的蓝图
UE5 使用动画模板创建多个动画蓝图

但是如果要第一人称操作角色,我们还需要一个查看游戏的视角的相机和一个控制相机的弹簧臂。
在这里插入图片描述
在胶囊体组件下面添加一个弹簧臂组件用于控制和角色之间的距离,然后再添加相机用于可以查看角色和场景。
在这里插入图片描述
修改弹簧臂让它有个俯视角查看角度。
在这里插入图片描述
记得关闭使用Pawn控制旋转,如果这个勾选,那么角色的朝向会跟随相机的朝向。
并且弹簧臂也不继承父节点的Pitch Yaw 和Roll的值

// 版权归暮志未晚所有。


#include "Character/HeroCharacter.h"

#include "GameFramework/CharacterMovementComponent.h"

AHeroCharacter::AHeroCharacter()
{
	GetCharacterMovement()->bOrientRotationToMovement = true; //设置为true,角色将朝移动的方向旋转
	GetCharacterMovement()->RotationRate = FRotator(0.f, 400.f, 0.f); //旋转速率
	GetCharacterMovement()->bConstrainToPlane = true; //约束到平面
	GetCharacterMovement()->bSnapToPlaneAtStart = true; //设置了上面一项为true,且此项设置为true,则在开始时与地面对其

	//设置使用控制器选择Pitch,Yaw,Roll的值。
	bUseControllerRotationPitch = false;
	bUseControllerRotationRoll = false;
	bUseControllerRotationYaw = false;
}

在英雄角色基类里面,也做了一些基础设置,这些设置其实在蓝图里面也可以直接设置。

接下来即可运行查看效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/315619.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用React给XXL-JOB开发一个新皮肤(三):实现登录页和Layout骨架

目录 一. 简述二. 接口服务调整 2.1. 登录接口2.2. 登出接口2.3. 修改密码接口2.4. 修改配置文件 三. 前端HTTP 请求四. 登录页面 4.1. 搭建登录页面4.2. 对接登录接口 五. Layout 骨架 5.1. 搭建骨架5.2. Header5.3. 修改密码5.4. 退出登录 六. 其他 一. 简述 上一篇文章我…

Android代码混淆

Android之代码混淆 代码混淆的作用设置混淆1. 在模块目录下的 build.gradle 文件中配置以下代码2. 在 proguard-rules.pro 文件中添加混淆规则 通用混淆规则常用匹配符常用命令注意事项如何查看是否已混淆 代码混淆的作用 1.令 APK 难以被逆向工程&#xff0c;即很大程度上增加…

Nightingale 夜莺监控系统 - 监控篇(2)

Author&#xff1a;rab 官方文档&#xff1a;https://flashcat.cloud/docs/content/flashcat-monitor/categraf/3-configuration/ 目录 前言一、Categraf 配置文件二、Input 插件配置文件2.1 插件说明2.2 通用配置2.2.1 配置采集频率 interval2.2.2 配置采集实例 instances2.2…

Spring Boot - Application Events 的发布顺序_ContextRefreshedListener

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的&#xff0c;它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

AI语音识别模块--whisper模块

1.下载 ffmpeg&#xff0c;挑一个自己电脑系统的版本&#xff0c;下载&#xff0c;如我win64&#xff1a; 地址&#xff1a; Releases BtbN/FFmpeg-Builds GitHub 下载压缩包zip&#xff0c;到本地 解压安装&#xff0c;其实无需安装&#xff0c;只需把对应的目录下的bin&…

2024年第1周,第一期技术动态

大家好&#xff0c;才是真的好。 今天周五&#xff0c;我们继续介绍与Domino相关产品新闻&#xff0c;以及互联网或其他IT行业动态等。 一、Notes/Domino V9和V10技术支持结束和假消息 今年2024年6月1号&#xff0c;HCL将结束IBM Notes/Domino 9.0.x和10.0.x产品的技术支持声…

制作 CentOS Stream9 的U盘系统启动盘

一、简述 注:请勿用于商用&#xff0c;如有版权纠纷&#xff0c;于博主无任何关系。&#xff08;仅用于学习研究使用&#xff09; 由于CentOs Linux 7和CentOs Stream8终止日期是2024年&#xff0c;需要将系统升级到最新版本的CentOs Stream9&#xff0c;下面是刻录系统盘的操…

用js做个转盘

样式 <style>.wheel {position: relative;width: 400px;height: 400px;border: 1px solid black;border-radius: 50%;overflow: hidden;margin: auto;}.slice {position: absolute;left: 0;top: 0;width: 0;height: 0;border: 200px solid red;/* border-width: 100px 10…

Linux/SwagShop

Enumeration nmap 仍然一样&#xff0c;先使用nmap探索目标开放端口情况 看到开启了22端口和80端口&#xff0c;还是一样的&#xff0c;先从80端口开始探索&#xff0c;从nmap给出的结果&#xff0c;我们可以看到有一个域名&#xff0c;因此在/etc/hosts中添加域名到IP的映射…

ODBC 在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配

常规办法就是64位或32位匹配&#xff0c;如果解决不了&#xff0c;往下看。 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓解决方案↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 解压AccessDatabaseEngine_X64.exe&#xf…

【C++】C++11中的常见语法(下)

C11 一、可变参数模板1. 递归函数方式展开参数包2. 逗号表达式展开参数包3. STL容器中的 empalce 相关接口函数 二、lambda 表达式1. C98 中的一个例子2. 使用 lambda 表达式3. lambda 表达式语法&#xff08;1&#xff09;lambda 表达式各部分说明&#xff08;2&#xff09;捕…

池化、线性、激活函数层

一、池化层 池化运算是深度学习中常用的一种操作&#xff0c;它可以对输入的特征图进行降采样&#xff0c;从而减少特征图的尺寸和参数数量。 池化运算的主要目的是通过“收集”和“总结”输入特征图的信息来提取出主要特征&#xff0c;并且减少对细节的敏感性。在池化运算中…

基于SSM的电脑测评系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电脑测评系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

Python教父推荐:《Python基础教程》(第3版) 中文PDF电子版限免

《Python基础教程 第3版》包括Python程序设计的方方面面&#xff1a;首先&#xff0c;从Python的安装开始&#xff0c;随后介绍了Python的基础知识和基本概念&#xff0c;包括列表、元组、字符串、字典以及各种语句&#xff1b;然后循序渐进地介绍了一些相对高-级的主题&#x…

旅游数据可视化大屏:一屏掌控,畅游数据之海

随着旅游业的蓬勃发展&#xff0c;如何有效地管理和分析旅游数据成为行业关注的焦点。旅游数据可视化大屏作为一种新兴的技术手段&#xff0c;为旅游业带来了前所未有的机遇和挑战。 旅游数据可视化大屏集成了丰富的数据资源&#xff0c;通过直观的图表、图像和交互界面&#x…

MySQL面试题 | 03.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

基于面向对象编程,C++实现单链表

链表&#xff1a;在内存空间中是非连续存储 组成&#xff1a;链表是由一个个节点组成的&#xff0c;每个节点都包含两个元素&#xff1a;数据和指针 节点头文件&#xff1a; 建立一个ListNode.h头文件 #pragma once class ListNode { public:int value;ListNode* next;Lis…

web前端算法简介之队列

队列 队列基本操作 入队&#xff08;enqueue&#xff09;&#xff1a;将元素添加到队列的尾部。出队&#xff08;dequeue&#xff09;&#xff1a;从队列的头部移除元素。队首&#xff08;front&#xff09;&#xff1a;获取队列头部的元素&#xff0c;但不移除它。队尾&#x…

【机器学习300问】5、什么是强化学习?

我将从三个方面为大家简明阐述什么是强化学习&#xff0c;首先从强化学习的定义大家的了解强化学习的特点&#xff0c;其次学习强化学习里特殊的术语加深对强化学习的理解&#xff0c;最后通过和监督学习与无监督学习的比较&#xff0c;通过对比学习来了解强化学习。 一、强化…

canvasdrawer 微信原生小程序生成海报图片

在小程序中生成海报是一种非常有效的推广方式 用户可以使用小程序的过程中生成小程序海报并分享给他人 通过海报的形式&#xff0c;用户可以直观地了解产品或服务的特点和优势 常见绘制海报方式 目前&#xff0c;小程序海报有两种常见的实现方式&#xff1a; canvas 绘制…