UE5 实现RPG游戏操作控制

2024-01-13 11:20

本文主要是介绍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到1const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); //获取世界坐标系下向右的值,-1到1if(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;
}

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

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

这篇关于UE5 实现RPG游戏操作控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环