虚幻学习笔记20—C++中用户输入控制

news2025/2/6 9:55:59

一、前言

        用户输入主要有鼠标和键盘以及其他的遥感外接设备等,在虚幻中经常会用到这些输入设备的值,比如通过鼠标控制摄像头的方向、键盘控制人物移动等。本文主要讲解简单的输入绑定和虚幻5新增的”增强输入控制“两种方法。

二、实现

2.1、原始的输入

1、最早的时候虚幻的输入需要在”项目设置-》输入”中添加“操作映射”,如图2.1.1所示,添加

图2.1.1

两个鼠标滚动的操作映射。

2、然后再在代码中进行绑定,如下,其中”WheelUpFunction“和”WheelDownFunction“方法是处理

	InputComponent->BindAction("WheelUp", IE_Pressed, this, &AMyPlayerController1::WheelUpFunction);
	InputComponent->BindAction("WheelDown", IE_Pressed, this, &AMyPlayerController1::WheelDownFunction);

两个方法,在其中就可以实现一些操作逻辑,比如下面的代码实现Pawn的摄像机Zoom的缩放

void AMyPlayerController1::WheelUpFunction()
{
	if (GetPawn())
	{
		AMyPawn1* tempPawn = Cast<AMyPawn1>(GetPawn());
		if (tempPawn)
		{
			tempPawn->ZoomCam(1, 10);
		}
	}
}

void AMyPlayerController1::WheelDownFunction()
{
	if (GetPawn())
	{
		AMyPawn1* tempPawn = Cast<AMyPawn1>(GetPawn());
		if (tempPawn)
		{
			tempPawn->ZoomCam(0, 10);
		}
	}
}

2.2、增强输入

1、创建”输入操作“和”输入映射情境“

        在图2.1.1中也可以看到虚幻5之后是准备要摒弃掉原始的输入映射,因为很不灵活,在虚幻5之后引入了一个增强输入的东西,增强输入有两部分组成:”输入操作“和”输入映射情境“,如图

图2.2.1

2.2.1所示,首先要先创建输入操作”IA_Jump“,然后设置其值类型即可,如图2.2.2所示值类型包括

图2.2.2

图中的布尔、浮点、向量等。布尔呢即实现是否按下,有数值的就可以获取按下后的值,然后创建”输入映射情境“IMC_Default,如图2.2.3所示,在IMC_Default中添加一个新的映射,并在映射中

图2.2.3

绑定之前创建的输入操作”IA_Jump“,然后再输入中选择”空格键“。重复上述步骤添加移动和旋转的输入操作。

2、在C++代码中使用增强输入

 1)首先,要在Build.CS文件中增加模块"EnhancedInput" ,代码如下:

        PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput" });

2)然后,即可以在头文件中添加增强输入的头文件,并添加输入上下文变量和输入操作的的方法

//增强输入头文件
#include "InputActionValue.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"

UCLASS()
class CHAPTER2_API AMyCharacter1 :public ACharacter, public IMyInterface1
{
	GENERATED_BODY()

public:
	// Sets default values for this character's properties
	AMyCharacter1();

    	/// <summary>
	/// 输入上下文
	/// </summary>
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MyInput")
	class UInputMappingContext* MyMappingContext;
	/// <summary>
	/// 一个移动的输入映射变量
	/// </summary>
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MyInput")
	class UInputAction* ActionMove;
	//旋转映射
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MyInput")
	class UInputAction* ActionRotate;
}

3)在SetupPlayerInputComponent中实现最终绑定并处理移动和旋转的逻辑,代码如下:

void AMyCharacter1::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	//绑定映射,将玩家输入映射转化成增强输入映射
	UEnhancedInputComponent* tempEnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent);
	if (tempEnhancedInputComponent)
	{
		//第一个参数是映射的变量,第二个是移动的方式,第三个是绑定的函数
		tempEnhancedInputComponent->BindAction(ActionMove, ETriggerEvent::Triggered, this, &AMyCharacter1::Move);
		tempEnhancedInputComponent->BindAction(ActionRotate, ETriggerEvent::Triggered, this, &AMyCharacter1::Rotate);
	}
}

void AMyCharacter1::Move(const FInputActionValue& value)
{
	FVector2D tempMoveVec = value.Get<FVector2D>();
	//如果控制器有输入
	if (nullptr != Controller)
	{
		const FRotator tempRot = Controller->GetControlRotation();
		const FRotator	tempYaw(0, tempRot.Yaw, 0);
		const FVector	tempForwardDir = FRotationMatrix(tempYaw).GetUnitAxis(EAxis::X);//前方向的方向向量
		const FVector tempRightDir = FRotationMatrix(tempYaw).GetUnitAxis(EAxis::Y);//获得右方向的向量

		//添加键盘输入
		AddMovementInput(tempForwardDir, tempMoveVec.Y);//Y方向的移动
		AddMovementInput(tempRightDir, tempMoveVec.X);
	}
}

void AMyCharacter1::Rotate(const FInputActionValue& value)
{
	FVector2D tempLookAxisVec = value.Get<FVector2D>();
	if (nullptr != Controller)
	{
		AddControllerYawInput(tempLookAxisVec.X);
		AddControllerPitchInput(tempLookAxisVec.Y);
	}

}

4)创建MyCharacter1类的蓝图,在蓝图的变量中添加之前创建的输入映射,如图2.2.4所示

图2.2.4

三、总结

3.1、原始的输入虚幻5之后会渐渐摒弃掉,尽早学会使用新的“增强输入”。

3.2、增强输入可以针对性的设置和绑定输入,对比原始的输入更加系统和便捷。

3.3、增加输入在C++代码中一定要在Build.CS中添加“EnhancedInput”模块。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习--线性回归

目录 监督学习算法 线性回归 损失函数 梯度下降 目标函数 更新参数 批量梯度下降 随机梯度下降 小批量梯度下降法 数据预处理 特征标准化 正弦函数特征 多项式特征的函数 数据预处理步骤 线性回归代码实现 初始化步骤 实现梯度下降优化模块 损失与预测模块 …

FastAPI实现文件上传下载

FastAPI实现文件上传下载 1.后端FastAPI2.后端html3.效果 最近的项目需求&#xff0c;是前端vue&#xff0c;后端fastAPI&#xff0c;然后涉及到图像的消息发送&#xff0c;所以需要用fast写文件上传下载的接口&#xff0c;这里简单记录一下。 1.后端FastAPI import os.path i…

【藏经阁一起读】(80)__《2023龙蜥社区白皮书》

【藏经阁一起读】&#xff08;80&#xff09;__《2023龙蜥社区白皮书》 2023龙蜥社区白皮书 作者&#xff1a; 小龙 发布时间&#xff1a;2023-11-15 章节数&#xff1a;79 内容简介&#xff1a; 从解决CentOS停服的问题出发为广大用户的业务连续性提供了坚定的保障&#xf…

R语言【cli】——通过cli_abort用 cli 格式的内容显示错误、警告或信息,内部调用cli_bullets和inline-makeup

cli_abort(message,...,call .envir,.envir parent.frame(),.frame .envir ) 先从那些不需要下大力气理解的参数入手&#xff1a; 参数【.envir】&#xff1a;进行万能表达式编译的环境。 参数【.frame】&#xff1a;抛出上下文。默认用于参数【.trace_bottom】&#xff…

Python---socket 的介绍

1. 问题思考 到目前为止我们学习了 ip 地址和端口号还有 tcp 传输协议&#xff0c;为了保证数据的完整性和可靠性我们使用 tcp 传输协议进行数据的传输&#xff0c;为了能够找到对应设备我们需要使用 ip 地址&#xff0c;为了区别某个端口的应用程序接收数据我们需要使用端口号…

MySQL数据库8.0+版本部署安装

1、安装前准备 1.1、安装文件上传 以mysql-8.0.32版本为例&#xff0c;将 mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz 、my.cnf上传至/opt/software目录。 安装文件百度网盘下载地址&#xff1a; mysql-8.0.32&#xff1a;https://pan.baidu.com/s/1gtPYEa2aT0V2-1Q3-KKxl…

【SpringMVC】REST(Representation State Transfer)ful开发

REST全称Representation State Transfer&#xff0c;表现形式状态转换 文章目录 1. 为什么提出了REST&#xff1f;2. RESTful入门案例案例代码修改请求方式修改成RESTful风格&#xff0c;并以POST方式提交 RESTful格式下传参RESTful入门案例总结RequestBody&#xff0c;Reques…

【高效开发工具系列】eclipse部署web项目

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Go 随机密码

一.Go实现随机密码 随机密码 package mainimport ("fmt""math/rand""os""strconv""time" )func RandomPassword(num int) {length : numif len(os.Args) > 1 {arg : os.Args[1]i, err : strconv.ParseInt(arg, 10, 6…

LeetCode做题总结 1. 两数之和

1. 两数之和 暴力法哈希法重新分析Java语法 暴力法 2023.09.20 刚开始用暴力法破解&#xff08;C&#xff09; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> a;for(int i0; i<nums.size()-1; i) {for(…

flink watermark 实例分析

WATERMARK 定义了表的事件时间属性&#xff0c;其形式为: WATERMARK FOR rowtime_column_name AS watermark_strategy_expression rowtime_column_name 把一个现有的列定义为一个为表标记事件时间的属性。该列的类型必须为 TIMESTAMP(3)/TIMESTAMP_LTZ(3)&#xff0c;且是 sche…

pdf 在线编辑

https://smallpdf.com/edit-pdf#rapp 参考 https://zh.wikihow.com/%E5%B0%86%E5%9B%BE%E5%83%8F%E6%8F%92%E5%85%A5PDF

网络基础篇【网线的制作,OSI七层模型,集线器和交换机的介绍,路由器的介绍与设置】

目录 一、网线制作 1.1 工具介绍 1.1.1网线 1.1.2 网线钳 1.1.3 水晶头 1.1.4 网线测试仪 二、OSI七层模型 2.1 简介 2.2 OSI模型层次介绍 2.2.1 结构图 2.2.2 数据传输过程 2.3 相关网站 二、集线器 2.1 介绍 2.2 适用场景 三、交换机 3.1 介绍 3.2 适用场景…

【Java】Mac下的Tomcat安装配置

&#x1f514;Tomcat是一个免费的开源web应用服务器&#xff0c;是开发和调试JSP 程序的首选&#x1f590;可利用它响应HTML页面的访问请求。 我们在进行网络编程时&#xff0c;其中重要的中间件就是Tomcat&#xff0c;下面我们将进行在Mac上配置Tomcat的讲解。&#x1f632; …

医院影像科PACS系统源码,医学影像系统,支持MPR、CPR、MIP、SSD、VR、VE三维图像处理

PACS系统是医院影像科室中应用的一种系统&#xff0c;主要用于获取、传输、存档和处理医学影像。它通过各种接口&#xff0c;如模拟、DICOM和网络&#xff0c;以数字化的方式将各种医学影像&#xff0c;如核磁共振、CT扫描、超声波等保存起来&#xff0c;并在需要时能够快速调取…

Redis-学习笔记

Remote Dictionary Server(Redis) 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库&#xff0c;并提供多种语言的 API&#xff0c;是跨平台的非关系型数据库。 Redis 通常被称为数据结构服务器&…

自媒体新手如何写出爆款公众号文章

今天跟大家分享一下&#xff0c;作为新手怎么样写出一篇阅读量过万的公众号的文章。 我的公众号是从2020年开始写的&#xff0c;写到今天差不多三年多一点。然后现在的粉丝数虽然不多&#xff0c;但也差不多近两千个了。 我这三年多差不多更新了150篇原创文章。刚开始的时候写的…

【谭浩强C程序设计精讲 2】整型数据

文章目录 3.3 整型数据3.3.1 整型常量的表示方法3.3.2 整型变量1. 整型数据在内存中的存放形式2. 整型变量的分类3. 整型变量的定义4. 整型数据的溢出 3.3.3 整型常量的类型 3.3 整型数据 3.3.1 整型常量的表示方法 整型常量即整常数。C 的整常数可以用以下三种形式表示&…

ISA95 及工业互联网平台

ISA95简称S95&#xff0c;是美国仪表、系统和自动化协会&#xff08;ISA&#xff09;在95年提出来的&#xff0c;也是这个协会启动编制的第95个标准项目。它定义了企业商业和控制系统之间的集成&#xff0c;主要可以分成三个层次&#xff1a; 第0&#xff0c;1&#xff0c;2层…

Ubuntu 常用命令之 fdisk 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 fdisk 是一个用于处理磁盘分区的命令行工具&#xff0c;它在 Linux 系统中广泛使用。fdisk 命令可以创建、删除、更改、复制和显示硬盘分区&#xff0c;以及更改硬盘的分区 ID。 fdisk 命令的常用参数如下 -l&#xff1a;列出所…