관리 메뉴

Mini

[UE5] 태그에 맞는 능력 활성화 구현 본문

UE5/Gameplay Abilities

[UE5] 태그에 맞는 능력 활성화 구현

Mini_96 2024. 6. 9. 14:38

* GA에서 시작태그가 뭔지확인용 변수추가

UCLASS()
class AURA_API UAuraGameplayAbility : public UGameplayAbility
{
    GENERATED_BODY()

public:

    UPROPERTY(EditDefaultsOnly,Category="Input")
    FGameplayTag StartupInputTag;
};

* ASC에서 그 태그를 확인하고 

동적태그에 추가 => 런타입에 변경가능

능력활성화

void UAuraAbilitySystemComponent::AddCharacterAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupAbilities)
{
    //모든 시작능력에대해
    for(const TSubclassOf<UGameplayAbility> AbilityClass : StartupAbilities)
    {
       //능력의 스펙을 얻고
       FGameplayAbilitySpec AbilitySpec=FGameplayAbilitySpec(AbilityClass,1);
       //아우라GA에서 파생된 클래스의 경우라면
       if(const UAuraGameplayAbility* AuraAbility = Cast<UAuraGameplayAbility>(AbilitySpec.Ability))
       {
          //시작입력태그를 동적능력태그에 추가
          AbilitySpec.DynamicAbilityTags.AddTag(AuraAbility->StartupInputTag);//동적능력태그 => 런타입에 추가제거가능 => 키바꾸기가능
          //능력 활성화
          GiveAbility(AbilitySpec);
       }
       
       //GiveAbility(AbilitySpec);
       //GiveAbilityAndActivateOnce(AbilitySpec);
    }
}

함수 2개만들기

void UAuraAbilitySystemComponent::AbilityInputTagHeld(const FGameplayTag& InputTag)
{
    
}

void UAuraAbilitySystemComponent::AbilityInputTagReleased(const FGameplayTag& InputTag)
{
}

 

* PC에서 ASC변수추가, 싱글톤 Getter 만들기

UPROPERTY()
TObjectPtr<UAuraAbilitySystemComponent> AuraAbilitySystemComponent;
UAuraAbilitySystemComponent* GetASC();
//싱글톤 Getter
UAuraAbilitySystemComponent* AAuraPlayerController::GetASC()
{
    if(AuraAbilitySystemComponent == nullptr)
    {
       AuraAbilitySystemComponent =
          Cast<UAuraAbilitySystemComponent>(UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(GetPawn<APawn>()));
    }
    return AuraAbilitySystemComponent;
}

ASC에서 만들어놓은 함수 호출

void AAuraPlayerController::AbilityInputTagPressed(FGameplayTag InputTag) //처음누름
{
    if(GetASC()==nullptr) return;
    
    GetASC()->AbilityInputTagHeld(InputTag);
}

void AAuraPlayerController::AbilityInputTagReleased(FGameplayTag InputTag) //뗌
{
    if(GetASC()==nullptr) return;
    
    GetASC()->AbilityInputTagHeld(InputTag);
}

void AAuraPlayerController::AbilityInputTagHeld(FGameplayTag InputTag) //누르는중
{
    if(GetASC()==nullptr) return;
    
    GetASC()->AbilityInputTagHeld(InputTag);
}

ASC에서 함수구현

//태그에 맞는 능력활성화 && 능력에게 입력이 눌려졌다고 알리는 함수
void UAuraAbilitySystemComponent::AbilityInputTagHeld(const FGameplayTag& InputTag)
{
    if(!InputTag.IsValid()) return; //태그검사

    //활성화가능한 능력에대해
    for(FGameplayAbilitySpec& AbilitySpec : GetActivatableAbilities())
    {
       //입력태그와 동일한 능력을 활성화시킴!
       if(AbilitySpec.DynamicAbilityTags.HasTagExact(InputTag))
       {
          //이미활성화된경우 -> pass
          //활성화안된경우 -> 활성화
          if(!AbilitySpec.IsActive())
          {
             TryActivateAbility(AbilitySpec.Handle);
          }
          AbilitySpecInputPressed(AbilitySpec); //능력에게 입력이 눌려졌다고 알림
       }
    }
}

//입력이 더이상 안눌린다고 알리는 함수
void UAuraAbilitySystemComponent::AbilityInputTagReleased(const FGameplayTag& InputTag)
{
    if(!InputTag.IsValid()) return; //태그검사

    //활성화가능한 능력에대해
    for(FGameplayAbilitySpec& AbilitySpec : GetActivatableAbilities())
    {
       //입력태그와 동일한 능력을 활성화시킴!
       if(AbilitySpec.DynamicAbilityTags.HasTagExact(InputTag))
       {
          AbilitySpecInputReleased(AbilitySpec); //능력에게 입력이 더이상 안눌린다고 알림

       }
    }
}

 

* Test

마우스좌클릭을 계속눌러도 한번활성화되고 , 이미활성화된능력은 다시활성화 안됨
5초후 능력종료
이떄, 딜레이가없으면 능력활성화 되자마자 끝내서 무한능력 사용됨에 주의
좋버그

 

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/e325eb6d2abf5329b7128f47f4e3b33c6b60a343

 

feat : 태그에 맞는 능력 활성화 구현 · DongHoonYu96/GameplayAbilitySystem_Aura@e325eb6

Bisu96 committed Jun 9, 2024

github.com