🎮 UDataAsset_StartUpBase.h
class UBFGameplayAbility; class UBFAbilitySystemComponent; UCLASS() class BOSSFIGHT_API UDataAsset_StartUpBase : public UDataAsset { GENERATED_BODY() public: virtual void GiveToAbilitySystemComponent(UBFAbilitySystemComponent* InASCToGive, int32 ApplyLevel = 1); protected: UPROPERTY(EditDefaultsOnly, Category = "StartUpData") TArray<TSubclassOf<UBFGameplayAbility>> ActivateOnGivenAbilities; UPROPERTY(EditDefaultsOnly, Category = "StartUpData") TArray<TSubclassOf<UBFGameplayAbility>> ActivateOnTriggerdAbilities; void GrantAbilities(const TArray<TSubclassOf<UBFGameplayAbility>>& InAbilityToGive, UBFAbilitySystemComponent* InASCToGive, int32 ApplyLevel = 1); };🎮 UDataAsset_StartUpBase.cpp
void UDataAsset_StartUpBase::GiveToAbilitySystemComponent(UBFAbilitySystemComponent* InASCToGive, int32 ApplyLevel) { check(InASCToGive); GrantAbilities(ActivateOnGivenAbilities, InASCToGive, ApplyLevel); GrantAbilities(ActivateOnTriggerdAbilities, InASCToGive, ApplyLevel); } void UDataAsset_StartUpBase::GrantAbilities(const TArray<TSubclassOf<UBFGameplayAbility>>& InAbilityToGive, UBFAbilitySystemComponent* InASCToGive, int32 ApplyLevel) { if (InAbilityToGive.IsEmpty()) { return; } for (const TSubclassOf<UBFGameplayAbility>& Ability : InAbilityToGive) { if (!Ability) { continue; } FGameplayAbilitySpec AbilitySpec(Ability); AbilitySpec.SourceObject = InASCToGive->GetAvatarActor(); InASCToGive->GiveAbility(AbilitySpec); } }해당 클래스를 상속받아 UDataAsset_StartUpPlayer를 생성하였다.
Test를 위해 UBFGameplayAbility를 상속 받아 GA_Test를 추가하였다.
그후 DataAsset을 생성하여, ActivateOnGivenAbilities 와 ActivateOnTriggerdAbilities에 하나씩 추가 해주었다.
void ABFPlayerCharacter::PossessedBy(AController* NewController) { Super::PossessedBy(NewController); if (!CharacterStartUpData.IsNull()) { if (UDataAsset_StartUpBase* LodedData = CharacterStartUpData.LoadSynchronous()) { LodedData->GiveToAbilitySystemComponent(BFAbilitySystemComponent); } } }

🎮 UDataAsset_InputConfig.h
UCLASS() class BOSSFIGHT_API UDataAsset_InputConfig : public UDataAsset { GENERATED_BODY() //중략 UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (TitleProperty = "InputTag")) TArray<FBFInputActionConfig> AbilityInputActions; };
UDataAsset_StartUpPlayer.h
UCLASS() class BOSSFIGHT_API UDataAsset_StartUpPlayer : public UDataAsset_StartUpBase { GENERATED_BODY() public: virtual void GiveToAbilitySystemComponent(UBFAbilitySystemComponent* InASCToGive, int32 ApplyLevel = 1) override; private: UPROPERTY(EditDefaultsOnly, Category = "StartUpData", meta = (TitleProperty = "InputTag")) TArray<FBFAbilitySet> PlayerAbilitySets; };🎮 UDataAsset_StartUpPlayer.cpp
void UDataAsset_StartUpPlayer::GiveToAbilitySystemComponent(UBFAbilitySystemComponent* InASCToGive, int32 ApplyLevel) { Super::GiveToAbilitySystemComponent(InASCToGive, ApplyLevel); for (const FBFAbilitySet& AbilitySet : PlayerAbilitySets) { if (!AbilitySet.IsVaild()) { continue; } FGameplayAbilitySpec AbilitySpec(AbilitySet.AbilityToGrant); AbilitySpec.SourceObject = InASCToGive->GetAvatarActor(); AbilitySpec.Level = ApplyLevel; AbilitySpec.DynamicAbilityTags.AddTag(AbilitySet.InputTag); InASCToGive->GiveAbility(AbilitySpec); } }
🎮 UInputComponent.h
UCLASS() class BOSSFIGHT_API UBFInputComponent : public UEnhancedInputComponent { GENERATED_BODY() //중략 template<class UserObject, typename CallbackFunc> inline void BindAbilityInputAction(const UDataAsset_InputConfig* InInputConfig, UserObject* ContextObject, CallbackFunc InputPressedFunc, CallbackFunc InputRelasedFunc); }; template<class UserObject, typename CallbackFunc> inline void UBFInputComponent::BindAbilityInputAction(const UDataAsset_InputConfig* InInputConfig, UserObject* ContextObject, CallbackFunc InputPressedFunc, CallbackFunc InputRelasedFunc) { checkf(InInputConfig, TEXT("Input Comfig DataAsset is Null")); for (const FBFInputActionConfig& AbilityInputActionConfig : InInputConfig->AbilityInputActions) { if (!AbilityInputActionConfig.IsVaild()) continue; BindAction(AbilityInputActionConfig.InputAction, ETriggerEvent::Started, ContextObject, InputPressedFunc, AbilityInputActionConfig.InputTag); BindAction(AbilityInputActionConfig.InputAction, ETriggerEvent::Completed, ContextObject, InputRelasedFunc, AbilityInputActionConfig.InputTag); } }BindAction()함수를 통해 InputAction과 ETriggerEvent, 호출할 함수, Tag를 Bind해주었다,
🎮 ABFPlayerCharacter.cpp
void ABFPlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { //중략 BFInputComponent->BindAbilityInputAction(InputConfigDataAsset, this, &ThisClass::Input_AbilityInputPressed, &ThisClass::Input_AbilityInputReleased); } void ABFPlayerCharacter::Input_AbilityInputPressed(FGameplayTag InInputTag) { BFAbilitySystemComponent->OnAbilityInputPressed(InInputTag); } void ABFPlayerCharacter::Input_AbilityInputReleased(FGameplayTag InInputTag) { BFAbilitySystemComponent->OnAbilityInputReleased(InInputTag); }

