UE5 C++(十三)— 创建Character,添加增强输入

news2024/11/13 9:45:30

文章目录

  • 创建Character第三人称模板
  • 添加增强输入引用
  • 在脚本中实现移动、旋转

创建Character第三人称模板

创建MyCharacter C++类
在这里插入图片描述
在这里插入图片描述

添加增强输入引用

在DEMO.Build.cs 脚本中添加增强输入模块
在这里插入图片描述
有个容易出错的点,这里的设置一定要正确
在这里插入图片描述
然后添加引用到C++头文件中

#include "InputActionValue.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"

最后,可以编译一下,看看输入模块(“EnhancedInput” )是否引入成功。

在脚本中实现移动、旋转

首先,是头文件添加引用
MyCharacter.h

#pragma once

#include "CoreMinimal.h"
#include "InputActionValue.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "GameFramework/Controller.h"
#include "GameFramework/SpringArmComponent.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"

UCLASS()
class DEMO_API AMyCharacter : public ACharacter
{
	GENERATED_BODY()

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

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	// Called to bind functionality to input
	virtual void SetupPlayerInputComponent(class UInputComponent *PlayerInputComponent) override;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MySceneComponent")
		USpringArmComponent *MySpringArm;
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MySceneComponent")
		UCameraComponent *MyCamera;
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
		class UInputMappingContext *DefaultMappingContext;
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
		class UInputAction* MoveAction;
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
		class UInputAction* LookAction;

	void Move(const FInputActionValue& Value);
	void Look(const FInputActionValue& Value);
};

然后在MyCharacter.cpp中实现

// Fill out your copyright notice in the Description page of Project Settings.

#include "MyCharacter.h"

// Sets default values
AMyCharacter::AMyCharacter()
{
	// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
	MySpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("MySpringArm"));
	MyCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("MyCamera"));
	MySpringArm->SetupAttachment(RootComponent);
	MyCamera->SetupAttachment(MySpringArm);
	MySpringArm->TargetArmLength = 300.0f;
	// 这么设置是为了让控制器的转动不影响角色的转动,只影响摄像机的转动
	bUseControllerRotationYaw = false;
	bUseControllerRotationPitch = false;
	bUseControllerRotationRoll = false;
	// 为了让角色的移动方向与摄像机的方向一致,需要设置以下参数
	GetCharacterMovement()->bOrientRotationToMovement = true;
	// 这是为了使用Pawn的控制器旋转
	MySpringArm->bUsePawnControlRotation = true;
}

// Called when the game starts or when spawned
void AMyCharacter::BeginPlay()
{
	Super::BeginPlay();
	APlayerController *PlayerController = Cast<APlayerController>(GetController());
	if (PlayerController)
	{
		UEnhancedInputLocalPlayerSubsystem *LocalPlayerSubsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer());
		if (LocalPlayerSubsystem)
		{
			LocalPlayerSubsystem->AddMappingContext(DefaultMappingContext, 0);
		}
	}
}

// Called every frame
void AMyCharacter::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
}

// Called to bind functionality to input
void AMyCharacter::SetupPlayerInputComponent(UInputComponent *PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	if (UEnhancedInputComponent *EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent))
	{
		EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::Move);
		EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyCharacter::Look);
	}
}

void AMyCharacter::Move(const FInputActionValue &Value)
{
	FVector2D MoveVector = Value.Get<FVector2D>();
	if (Controller != nullptr)
	{
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0, Rotation.Yaw, 0);
		const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
		const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
		AddMovementInput(ForwardDirection, MoveVector.Y);
		AddMovementInput(RightDirection, MoveVector.X);
	}
}

void AMyCharacter::Look(const FInputActionValue &Value)
{
	FVector2D LookVector = Value.Get<FVector2D>();
	if (Controller == nullptr)
	{
		return;
	}
	AddControllerYawInput(LookVector.X);
	AddControllerPitchInput(LookVector.Y);
}

编译之后,创建蓝图类BP_MyCharacter
在这里插入图片描述
这时候会有默认组件,缺少人物模型,我们可以在这里添加
在这里插入图片描述
添加动画蓝图类
在这里插入图片描述
其他设置
在这里插入图片描述
在这里插入图片描述

最后,拖到场景中,把WorldSetting -> Game Mode 设置为null
在这里插入图片描述
点击运行,就可以实现鼠标,键盘第三人称操作了。

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

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

相关文章

vim/vi 模式切换和常用快捷键

vim/vi 切换模式&#xff1a; vim/vi 常用快捷键&#xff1a; 一般模式&#xff1a; gg&#xff1a;文件开头、G&#xff1a;文件结尾 shift^ &#xff1a;光标当前行首、shift^&#xff1a;光标当前行尾 yy&#xff1a;复制、p&#xff1a;粘贴、dd&#xff1a;删除当前行、…

VScode右键没有go to definition选项

1. 背景 1.1. 项目代码在远程服务器上&#xff1b; 1.2. win重装系统&#xff0c;重新安装vscode出现问题&#xff0c;没重装系统之前是没问题的&#xff1b; 2. 问题 打开vscode&#xff0c;通过ssh链接远程服务器中的项目代码后&#xff0c;选中函数右键没有go to defini…

年底了,来看看测试大佬的年终项目总结吧!值得借鉴

测试总结&#xff0c;是测试负责人或测试经理的测试管理能力的体现。在项目或版本测试完成&#xff0c;测试报告上交后&#xff0c;测试的工作并不是完结了&#xff0c;而是另外一件大事需要做&#xff0c;那就是为这个项目或是版本做一次测试总结。 添加图片注释&#xff0c;不…

10本审稿及出版效率均较好的科普期刊参数分享!

医、药、护、技及医学工程等相关的人员&#xff0c;进行卫生高级职称评审时&#xff0c;需要在专业期刊上公开发表本专业学术论文&#xff0c;论文的方向、内容质量以及发表的刊物都至关重要。今天常笑医学给大家整理了10本审稿及出版效率均较好的科普期刊&#xff01;参数分享…

搭建React开发环境-webpack实现

周末在家学会React前端知识&#xff0c;记录下来&#xff0c;方便备查。 webpack版本&#xff1a;webpack5 编译器&#xff1a;vscode 第一步、新建项目及初始化 1&#xff09;新建项目文件夹 可命名为 my_webpack 2&#xff09;初始化项目 使用命令 npm init -y&#xff0c;…

[SpringBoot]接口的多实现:选择性注入SpringBoot接口的实现类

最近在项目中遇到两种情况&#xff0c;准备写个博客记录一下。 情况说明&#xff1a;Service层一个接口是否可以存在多个具体实现&#xff0c;此时应该如何调用Service&#xff08;的具体实现&#xff09;&#xff1f; 其实之前的项目中也遇到过这种情况&#xff0c;只不过我采…

CTF之逆向入门

逆向工程(Reverse Engineering)&#xff0c;又称反向工程&#xff0c;是一种技术过程&#xff0c;即对一项目标产品进行逆向分析及研究&#xff0c;从而演绎并得出该产品的处理流程、组织结构、功能性能规格等设计要素&#xff0c;以制作出功能相近&#xff0c;但又不完全一样的…

微信私密朋友圈被吐槽有BUG

日前&#xff0c;大量网友在各社交媒体上讨论微信私密朋友圈出现 Bug 的话题&#xff0c;起因是跨年期间一个网友发布了一条”私密朋友圈&#xff0c;但不一会就收到朋友发来的信息&#xff0c;”又偷偷发朋友圈了&#xff1f;“&#xff0c;估计此时网友可能已经”寒毛四起、汗…

物理机搭建hive

一、修改Hadoop配置 修改core-site.xml 配置yarn-site.xml 分发文件&#xff0c;然后重启集群 二、 Hive解压安装 上传文件 添加hive环境便量&#xff0c;source生效 启动高可用集群&#xff0c;启动hive 三、配置mysql元数据库 检查当前系统是否安装过Mysql&#xf…

基于MATLAB车牌识别系统设计

基于MATLAB车牌识别系统设计 一、设计方案 智能交通系统已成为现代社会道路交通发展趋势。在智能交通系统中&#xff0c;车牌自动识别系统是一个非常重要的发展方向。对于车牌识别系统的要满足当车辆通过摄像头采集车辆图片&#xff0c;将其图片进行图像预处理、车牌定位、字符…

关于FPGA仿真复位信号和实际板子复位信号的吐血大坑

最近在研究mipi dphy IP下载到板子上进行验证的初步流程问题 IP的example案例里面&#xff0c;系统复位全是高电平复位&#xff0c;低电平工作 想当然的打通IP流程&#xff0c;写工程的时候也使用了高电平复位&#xff0c;低电平复位 结果调试了N轮&#xff0c;init_done信号一…

通用web自动扩缩容_智能运维引擎CudgX

一、概述 CudgX是星汉未来自主研发的面向云原生时代的智能运维引擎&#xff0c;支持根据 MetricQPS 分段耗时指标进行自动扩缩容。 通过各类服务的多维度、大规模的日志数据采集以及机器学习训练分析&#xff0c;对服务进行数字化、指标化度量&#xff0c;并基于部署的…

基础算法【解题思路】:单链表的倒数第k个节点

定义指针p1&#xff0c;让p1走k步&#xff1a; 定义指针p2&#xff0c;在p1走了k步的时候&#xff0c;p2也跟着走。 p1走到最后的时候走了n-k步&#xff0c;停留在最后的null结点。 P2从头结点开始&#xff0c;也跟着走到了n-k步&#xff0c;而n-k恰好是倒数第k个节点。 例…

TypeScript 从入门到进阶之基础篇(六) 类型(断言 、推论、别名)| 联合类型 | 交叉类型

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇TypeScript 从入门到进阶…

css - 渐变样式实现(渐变边框 + 渐变背景)

.select {border-bottom: 2px solid; /* 下边框 */border-image: linear-gradient(90deg,rgba(250, 173, 20, 0) 0%,rgba(250, 173, 20, 1) 51.46%,rgba(125, 87, 10, 0) 100%)1; /* 边框渐变 */background-image: radial-gradient(circle at 49% 238%, #faad14, transparent 7…

2023APMCM亚太数学建模C题 - 中国新能源汽车的发展趋势(2)

五&#xff0e;问题二模型建立和求解 5.1 问题二模型建立和求解 针对题目二&#xff0c;题目要求收集中国新能源电动汽车行业发展数据&#xff0c;建立数学模型描述&#xff0c;并预测未来十年的发展。由于在第一文中&#xff0c;我们已经收集了一定的新能源行业发展数据&…

马尔可夫算法及其实例(预测类模型)

马尔科夫预测模型是一种基于马尔科夫过程的预测方法。马尔科夫过程是一类具有马尔科夫性质的随机过程&#xff0c;即未来的状态只依赖于当前状态&#xff0c;而与过去状态无关。这种过程通常用状态空间和状态转移概率矩阵来描述。 在马尔科夫预测模型中&#xff0c;系统被建模为…

提升工作效率:IDEA配置优化总结指南

idea 配置优化总结 配置优化优化性能优化JVM参数使用 jconsole 监控 full gc 频率关闭代码检查设置编译进程和Maven的堆值取消自动构建 修改快捷键System Settings个性化设置设置主题修改字体Color SchemeCode Style 包类设置设置maven自动导包显示pom依赖关系图&#xff0c;解…

【docker笔记】Docker网络

Docker网络 容器间的互联和通信以及端口映射 容器IP变动时候可以通过服务名直接网络通信而不受到影响 常用命令 查看网络 docker network ls创建网络 docker network create XXX网络名字查看网络源数据 docker network inspect XXX网络名字删除网络 docker network rm…

可视化监控EasyCVR视频分析/云存储平台iframe地址播放异常该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…