UE5入门学习笔记(五)——增强输入(Enhanced Input)

该博客聚焦UE5.3增强输入设置,介绍其已废弃轴和操作映射,默认用增强输入。着重阐述C++方式设置步骤,包括创建输入操作和映射情景、设置值类型、绑定键位、新建继承类、添加成员与处理函数、编译创建蓝图类等,最后运行场景验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考视频:https://www.bilibili.com/video/BV1Tr4y1b7C6
参考文章:https://zhuanlan.zhihu.com/p/522171880
https://docs.unrealengine.com/5.1/zh-CN/enhanced-input-in-unreal-engine/

0、前言

UE5.3中已经将之前的轴和操作映射废弃掉了,默认使用增强输入(Enhanced Input)。

在这里插入图片描述
在这里插入图片描述

1、蓝图方式

之后再补充。

2、C++方式

1、先在内容管理器中右键-输入-输入操作(Input Action)和输入映射情景(Input Mapping Context),这里创建了五个输入操作和两个输入映射情景。

在这里插入图片描述
在这里插入图片描述

2、双击打开创建的输入操作,输入操作有四种值类型可选,默认是数字(布尔),这里将Forward_Backward和Left_Right两个输入操作设置成了Axis1D(浮点)。

在这里插入图片描述

3、双击打开创建的输入映射情景,这里打开MoveBase,点击映射旁的加号添加新项,选择想要绑定映射的输入操作资产,然后点击旁的加号添加新项,然后选择想要绑定的键位,如果想要负值,则点击键位下的修改器旁的加号添加新项,并选择否定(Negate)(相当于老式轴映射中的给缩放设置-1.0),这里主要就添加了Forward_Backward和Left_Right两个输入操作,实现WSAD操作。

在这里插入图片描述

4、新建一个继承自AGameModeBase的类和一个APawn的类。

在这里插入图片描述

其中GeometrySandboxGameModeBase不需要做任何修改,主要是SandboxPawn。
首先添加一些成员,以及两个处理函数。

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ACTION")
TObjectPtr<UInputMappingContext> IMC_ACTION;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ACTION")
TObjectPtr<UInputMappingContext> IMC_MOVEBASE;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ACTION")
TObjectPtr<UInputAction> IA_MoveForwardBackward;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ACTION")
TObjectPtr<UInputAction> IA_MoveLeftRight;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ACTION")
TObjectPtr<UInputAction> IA_TurnLeftRight;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ACTION")
TObjectPtr<UInputAction> IA_LookUpDown;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ACTION")
TObjectPtr<UInputAction> IA_Jump;
void MoveForward(const FInputActionValue& inputValue);
void MoveRight(const FInputActionValue& inputValue);
void ASandboxPawn::MoveForward(const FInputActionValue& inputValue)
{
	float Amount = inputValue.GetMagnitude();

	UE_LOG(LogSandboxPawn, Display, TEXT("MoveForward run ! Value : %f"), Amount);

	VelocityVector.X = Amount;
}

void ASandboxPawn::MoveRight(const FInputActionValue& inputValue)
{
	float Amount = inputValue.GetMagnitude();

	UE_LOG(LogSandboxPawn, Display, TEXT("MoveRight run ! Value : %f"), Amount);

	VelocityVector.Y = Amount;
}

然后在SetupPlayerInputComponent函数中添加绑定。这里注意,ETriggerEvent具有已开始(Started)、进行中(Ongoing)、已触发(Triggered)、已完成(Completed)和已取消(Canceled)这几种状态,具体请见参考文章【1】,这里主要是Triggered和Completed,当按键按下时会触发Triggered,参数值为1,弹起以Completed结束,参数值为0,只绑定Triggered时,当按键弹起,VelocityVector没有赋0,则依旧会朝原方向移动,所以两个都需要绑定。

auto controller = Cast<APlayerController>(GetController());
if (controller != nullptr) 
{
	UE_LOG(LogSandboxPawn, Warning, TEXT("PlayerController available !"));

	auto subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(controller->GetLocalPlayer());
	if (subsystem != nullptr) 
	{
		UE_LOG(LogSandboxPawn, Warning, TEXT("EnhancedInputLocalPlayerSubsystem available !"));

		subsystem->AddMappingContext(IMC_ACTION, 0);
		subsystem->AddMappingContext(IMC_MOVEBASE, 0);
	}
}
auto enhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent);
if (enhancedInputComponent != nullptr) 
{
	UE_LOG(LogSandboxPawn, Warning, TEXT("EnhancedInputComponent available !"));

	if (!IA_MoveForwardBackward.IsNull()) 
	{
		enhancedInputComponent->BindAction(IA_MoveForwardBackward, ETriggerEvent::Triggered, this, &ASandboxPawn::MoveForward);
		enhancedInputComponent->BindAction(IA_MoveForwardBackward, ETriggerEvent::Completed, this, &ASandboxPawn::MoveForward);
	}
	if (!IA_MoveLeftRight.IsNull()) 
	{
		enhancedInputComponent->BindAction(IA_MoveLeftRight, ETriggerEvent::Triggered, this, &ASandboxPawn::MoveRight);
		enhancedInputComponent->BindAction(IA_MoveLeftRight, ETriggerEvent::Completed, this, &ASandboxPawn::MoveRight);
	}
}

最后在Tick函数中添加变换。

if (!VelocityVector.IsZero()) 
{
	const FVector NewLocation = GetActorLocation() + Velocity * DeltaTime * VelocityVector;
	SetActorLocation(NewLocation);
}

5、编译,然后进入编辑器,将两个类右键创建蓝图类。

在这里插入图片描述
在这里插入图片描述

双击打开BP_GeometrySandboxGameModeBase,将细节中的默认Pawn类设置为BP_SandboxPawn。

在这里插入图片描述

双击打开BP_SandboxPawn,给细节中ACTION下的参数选择对应的资产。

在这里插入图片描述

最后将世界场景设置中的游戏模式重载设置成BP_GeometrySandboxGameModeBase。

在这里插入图片描述

运行场景,按下W,场景摄像机向前移动,查看Log,会发现MoveForward函数被调用,并且值持续为1,当W弹起后,值为0。

在这里插入图片描述

UE5 (Unreal Engine 5)C++ 编程中创建一个增强输入系统 (Enhanced Input System, EIS) 的 Demo 需要遵循其提供的蓝图和C++ API。以下是基本步骤: 1. **设置项目**: - 在UE5中,首先确保你已经在合适的游戏模式(如GameMode或Blueprint Class)中打开了C++支持。 2. **引用库**: - 包含必要的头文件,如`FName`, `UInputComponent`, 和 `IInputAction` 等。例如: ```cpp #include "CoreMinimal.h" #include "GameFramework/InputActions.h" ``` 3. **创建输入动作**: - 创建一个继承自 `UInputAction` 的自定义类,这是EIS的核心组件。示例: ```cpp UCLASS() class YOURPROJECT_API UYourCustomAction : public UInputAction { GENERATED_BODY() // 添加动作描述,比如按键映射 static void RegisterInputActions(); // 实现回调函数处理用户的输入 virtual void OnExecute() override; virtual void OnCancel() override; }; ``` 4. **注册输入动作**: - 在`RegisterInputActions`静态函数中,注册你的定制动作到EIS系统: ```cpp void UYourCustomAction::RegisterInputActions() { Super::RegisterInputActions(); const FName YourActionName = FName("YourCustomAction"); InputComponent->BindAction(YourActionName, IEInputAction::EInputChannnel::Game, this, &UYourCustomAction::OnExecute); } ``` 5. **处理输入事件**: - 在`OnExecute`和`OnCancel`函数中,编写针对用户输入的操作代码。比如,你可以改变游戏状态或显示相应的UI反馈。 6. **测试Demo**: - 在C++测试场景中实例化你的输入组件,并在适当的地方绑定到自定义动作。在游戏运行时检查输入是否正常响应。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值