31. UE5 GAS RPG使用增强输入激活GameplayAbility(一)

本文介绍了如何在UnrealEngine5(UE5)中利用增强输入和DataAsset实现技能通过键位激活,包括创建DataAsset结构、绑定GameplayTag和InputAction,以及在PlayerController中处理输入事件的步骤。
摘要由CSDN通过智能技术生成

在前面文章中,我们实现了对技能添加并直接激活功能,介绍了GA的相关参数配置。现在,我们还不能通过键位触发技能,正常在游戏时,我们需要通过键位触发技能,实现技能的激活。
在UE5里面添加了增强输入,相对于之前的输入操作,切换为了模块化,我们可以通过切换输入上下文,来实现键位输入和InputAction的映射,你可以创建多个上下文蓝图,在角色不同操作时,切换不同的上下文来实现不同的映射,比如,在正常情况下,有一套控制任务的上下文,当角色进入汽车后,我们可以停止当前的上下文,并改为使用汽车操作上下文去实现。
我们将使用UE的游戏案例Lyra实现的简化版,可以根据输入决定如何激活技能,并且通过数据驱动,在运行时也可以修改输入映射。
接下来,我们将实现通过增强输入去激活GA,首先创建一个DataAsset,将Tag和InputAction绑定起来,然后自定义增强输入的管理器,增加自定义的绑定操作函数用于绑定,接着在PlayerController里面,实现对输入事件的绑定。

创建DataAsset

首先创建一个基于DataAsset的类
在这里插入图片描述
放置到一个Input目录中
在这里插入图片描述
关闭UE,让编辑器编译完成。首先创建一个结构体,作为数据资产的结构,里面需要设置GamplayTag和其对应的InputAction,并设置为蓝图的类型

USTRUCT(BlueprintType)
struct FInputActionStruct
{
	GENERATED_BODY()

	UPROPERTY(EditDefaultsOnly)
	const class UInputAction* InputAction = nullptr;

	UPROPERTY(EditDefaultsOnly)
	FGameplayTag InputTag = FGameplayTag();
};

接着创建一个数组变量,用于存储当前数据的列表,后面我们需要在面板上面去添加数据。

public:

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TArray<FInputActionStruct> AbilityInputActions;

增加一个函数,可以通过Tag去获取对应的InputAction的函数

	const UInputAction* FindAbilityInputActionForTag(const FGameplayTag& InputTag, bool bLogNotFound = false) const;

在函数实现方面,遍历整个数组,比对Tag,来获取到对应的InputAction并返回,如果发现获取不到的情况,我们可以将bLogNotFound设置为true,来查看那些Data设置的有问题。

const UInputAction* UInputConfig::FindAbilityInputActionForTag(const FGameplayTag& InputTag, bool bLogNotFound) const
{
	for(const FInputActionStruct& Action : AbilityInputActions)
	{
		if(Action.InputAction && Action.InputTag == InputTag)
		{
			return Action.InputAction;
		}
	}

	if(bLogNotFound)
	{
		UE_LOG(LogTemp, Error, TEXT("无法从InputConfig[%s]中找到InputTag[%s]对应的技能InputAction"), *GetNameSafe(this), *InputTag.ToString());
	}

	return nullptr;
}

添加Tag

DataAsset需要Tag和InputAction,我们先把需要Tag添加上。
打开MyGameplayTags类,之前我们添加过属性的Tag,在下面接着添加InputAction的,这里添加鼠标键和数字键的Tag

	FGameplayTag InputTag_LMB; //鼠标左键
	FGameplayTag InputTag_RMB; //鼠标右键
	FGameplayTag InputTag_1; //1键
	FGameplayTag InputTag_2; //2键
	FGameplayTag InputTag_3; //3键
	FGameplayTag InputTag_4; //4键

由于注册的代码太差,我将属性和InputAction的Tag分成了两个函数去注册,下面是专门注册Input的函数

void FMyGameplayTags::InitializeInputGameplayTags()
{
	GameplayTags.InputTag_LMB = UGameplayTagsManager::Get()
	.AddNativeGameplayTag(
		FName("Attributes.InputTag.LMB"),
		FString("鼠标左键")
		);
	
	GameplayTags.InputTag_RMB = UGameplayTagsManager::Get()
	.AddNativeGameplayTag(
		FName("Attributes.InputTag.RMB"),
		FString("鼠标右键")
		);
	
	GameplayTags.InputTag_1 = UGameplayTagsManager::Get()
	.AddNativeGameplayTag(
		FName("Attributes.InputTag.1"),
		FString("键盘1键")
		);
	
	GameplayTags.InputTag_2 = UGameplayTagsManager::Get()
	.AddNativeGameplayTag(
		FName("Attributes.InputTag.2"),
		FString("键盘2键")
		);
	
	GameplayTags.InputTag_3 = UGameplayTagsManager::Get()
	.AddNativeGameplayTag(
		FName("Attributes.InputTag.3"),
		FString("键盘3键")
		);
	
	GameplayTags.InputTag_4 = UGameplayTagsManager::Get()
	.AddNativeGameplayTag(
		FName("Attributes.InputTag.4"),
		FString("键盘4键")
		);
}

然后在初始化里面调用

void FMyGameplayTags::InitializeNativeGameplayTags()
{
	InitializeAttributeGameplayTags();
	InitializeInputGameplayTags();
}

编译打开UE,查看是否Tag注册成功
在这里插入图片描述

创建InputAction

我们之前创建过移动的InputAction用于移动操作
在这里插入图片描述
接着在此文件夹创建按键所需的InputAction
在这里插入图片描述
命名为IA_LMB,IA_是InputAction的推荐命名,将内部的值类型修改为浮点类型
在这里插入图片描述
接着将其它的InputAction都创建出来,进行同样的设置
在这里插入图片描述
创建完成InputAction,这只是单纯的InputAction,不添加到输入映射的上下文中,它是无法起作用的,接下来,我们添加到之前移动使用的上下文中。
这里有个小细节,我们绑定对应键位时,可以鼠标左键点击一下键盘图标,然后接着点击需要绑定的键位,就可以设置上。设置完成,在应用这个输入映射上下文时,对应键位的InputAction将会触发事件。
在这里插入图片描述
创建DataAsset的数据都有了,我们就可以创建数据列表了。

填充DataAsset

创建一个数据资产
在这里插入图片描述
选择InputConfig类
在这里插入图片描述
打开,我们需要将两项内容对应填充
在这里插入图片描述
数据创建完成
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值