在前面文章中,我们实现了对技能添加并直接激活功能,介绍了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类
打开,我们需要将两项内容对应填充
数据创建完成