// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "GameplayTagContainer.h"
#include "HeroWeaponData.generated.h"
class UInputMappingContext;
class UMyGameplayAbility;
USTRUCT(BlueprintType)
struct FHeroAbilitySet
{
GENERATED_BODY()
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (Categories = "InputTag"))
FGameplayTag InputTag;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
TSubclassOf<UMyGameplayAbility> AbilityToGrant;
bool IsValid() const;
};
HeroWeaponData.cpp代码
// Fill out your copyright notice in the Description page of Project Settings.
#include "Structs/HeroWeaponData.h"
#include "MyGameplayAbility.h"
bool FHeroAbilitySet::IsValid() const
{
return InputTag.IsValid() && AbilityToGrant;
}
3.启动数据定义一个启动自动学习的技能列表
DataAsset_StartUpData.h代码
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "Structs/HeroWeaponData.h"
#include "DataAsset_StartUpData.generated.h"
class UMyGameplayAbility;
class UMyAbilitySystemComponent;
/**
*
*/
UCLASS()
class RPGGAMETEST_API UDataAsset_StartUpData : public UDataAsset
{
GENERATED_BODY()
public:
// 将配置的ActivateOnGivenAbilities技能给InASCToGive组件
virtual void GiveToAbilitySystemComponent(UMyAbilitySystemComponent* InASCToGive, int32 ApplyLevel = 1);
protected:
// 赋予就激活的技能列表
UPROPERTY(EditDefaultsOnly, Category = "StartUpData")
TArray< TSubclassOf < UMyGameplayAbility > > ActivateOnGivenAbilities;
UPROPERTY(EditDefaultsOnly, Category = "StartUpData", meta = (TitleProperty = "InputTag"))
TArray<FHeroAbilitySet> HeroStartUpAbilitySets;
// 赋予一些节能给技能系统组件
void GrantAbilities(const TArray< TSubclassOf < UMyGameplayAbility > >& InAbilitiesToGive, UMyAbilitySystemComponent* InASCToGive, int32 ApplyLevel = 1);
};
DataAsset_StartUpData.cpp代码
// Fill out your copyright notice in the Description page of Project Settings.
#include "DataAssets/DataAsset_StartUpData.h"
#include "MyAbilitySystemComponent.h"
#include "MyGameplayAbility.h"
void UDataAsset_StartUpData::GiveToAbilitySystemComponent(UMyAbilitySystemComponent* InASCToGive, int32 ApplyLevel)
{
check(InASCToGive);
GrantAbilities(ActivateOnGivenAbilities, InASCToGive, ApplyLevel);
for (const FHeroAbilitySet& AbilitySet : HeroStartUpAbilitySets)
{
if (!AbilitySet.IsValid()) continue;
FGameplayAbilitySpec AbilitySpec(AbilitySet.AbilityToGrant);
AbilitySpec.SourceObject = InASCToGive->GetAvatarActor();
AbilitySpec.Level = ApplyLevel;
AbilitySpec.DynamicAbilityTags.AddTag(AbilitySet.InputTag);
InASCToGive->GiveAbility(AbilitySpec);
}
}
void UDataAsset_StartUpData::GrantAbilities(const TArray<TSubclassOf<UMyGameplayAbility>>& InAbilitiesToGive, UMyAbilitySystemComponent* InASCToGive, int32 ApplyLevel)
{
if (InAbilitiesToGive.IsEmpty())
{
return;
}
for (const TSubclassOf<UMyGameplayAbility>& Ability : InAbilitiesToGive)
{
if (!Ability) continue;
FGameplayAbilitySpec AbilitySpec(Ability);
AbilitySpec.SourceObject = InASCToGive->GetAvatarActor();
AbilitySpec.Level = ApplyLevel;
InASCToGive->GiveAbility(AbilitySpec);
}
}
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "GameplayTagContainer.h"
#include "DataAsset_InputConfig.generated.h"
class UInputAction;
class UInputMappingContext;
USTRUCT(BlueprintType)
struct FMyInputActionConfig
{
GENERATED_BODY()
public:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (Categories = "InputTag"))
FGameplayTag InputTag;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
UInputAction* InputAction;
bool IsValid() const
{
return InputTag.IsValid() && InputAction;
}
};
/**
*
*/
UCLASS()
class RPGGAMETEST_API UDataAsset_InputConfig : public UDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
UInputMappingContext* DefalutMappingContext;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (TitleProperty = "InputTag"))
TArray<FMyInputActionConfig> NativeInputActions;
// 技能映射 GameplayTag对应InputAction
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (TitleProperty = "InputTag"))
TArray<FMyInputActionConfig> AbilityInputActions;
UInputAction* FindNativeInputActionByTag(const FGameplayTag& InInputTag) const;
};
6.增加装备武器的GameplayTag
完整代码 MyGameplayTags.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "NativeGameplayTags.h"
namespace MyGameplayTags {
RPGGAMETEST_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Move);
RPGGAMETEST_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Look);
RPGGAMETEST_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_EquipAxe);
}
完整MyGameplayTags.cpp代码
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyGameplayTags.h"
namespace MyGameplayTags {
UE_DEFINE_GAMEPLAY_TAG(InputTag_Move, "InputTag.Move");
UE_DEFINE_GAMEPLAY_TAG(InputTag_Look, "InputTag.Look");
UE_DEFINE_GAMEPLAY_TAG(InputTag_EquipAxe, "InputTag.EquipAxe");
}
7.新建装备的InputAction
8.输入配置
9.UMyEnhancedInputComponent组件新增绑定技能输入接口
完整代码实现
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "EnhancedInputComponent.h"
#include "DataAssets/DataAsset_InputConfig.h"
#include "MyEnhancedInputComponent.generated.h"
/**
*
*/
UCLASS()
class RPGGAMETEST_API UMyEnhancedInputComponent : public UEnhancedInputComponent
{
GENERATED_BODY()
public:
template<class UserObject, typename CallbackFunc>
void BindNativeInputAction(const UDataAsset_InputConfig* InInputConfig, const FGameplayTag& InInputTag, ETriggerEvent TriggerEvent, UserObject* ContextObject, CallbackFunc Func);
template<class UserObject, typename CallbackFunc>
void BindAbilityInputAction(const UDataAsset_InputConfig* InInputConfig, UserObject* ContextObject, CallbackFunc InputPressedFunc, CallbackFunc InputRelasedFunc);
};
template<class UserObject, typename CallbackFunc>
inline void UMyEnhancedInputComponent::BindNativeInputAction(const UDataAsset_InputConfig* InInputConfig, const FGameplayTag& InInputTag, ETriggerEvent TriggerEvent, UserObject* ContextObject, CallbackFunc Func)
{
checkf(InInputConfig, TEXT("InInputConfig is null"));
if (UInputAction* FoundAction = InInputConfig->FindNativeInputActionByTag(InInputTag)) {
BindAction(FoundAction, TriggerEvent, ContextObject, Func);
}
}
template<class UserObject, typename CallbackFunc>
inline void UMyEnhancedInputComponent::BindAbilityInputAction(const UDataAsset_InputConfig* InInputConfig, UserObject* ContextObject, CallbackFunc InputPressedFunc, CallbackFunc InputRelasedFunc)
{
checkf(InInputConfig, TEXT("Input config data asset is null,can not proceed with binding"));
for (const FMyInputActionConfig& AbilityInputActionConfig : InInputConfig->AbilityInputActions)
{
if (!AbilityInputActionConfig.IsValid()) continue;
BindAction(AbilityInputActionConfig.InputAction, ETriggerEvent::Started, ContextObject, InputPressedFunc, AbilityInputActionConfig.InputTag);
BindAction(AbilityInputActionConfig.InputAction, ETriggerEvent::Completed, ContextObject, InputRelasedFunc, AbilityInputActionConfig.InputTag);
}
}