0. 개요
이전 포스트에서 캐릭터에 부여된 어빌리티에 태그를 설정했다.
이제 태그를 이용하여 버튼의 눌림 상태에 따라 어빌리티를 활성화/취소 시키는 방법을 알아본다.
1. 시작 어빌리티에 태그 부여하기
(1) 시작 어빌리티에 대응하는 태그 정의 - AuraGameplayAbility
public:
// 시작 어빌리티 일 경우 부여할 때 한 번만 확인하기
UPROPERTY(EditDefaultsOnly, Category="Input")
FGameplayTag StartupInputTag;
};
시작에 부여되는 어빌리티에 태그를 부여할 것이다.
(2) 시작 어빌리티에 태그 부여 - AuraASC의 AddCharacterAbilites 함수
void UAuraAbilitySystemComponent::AddCharacterAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupAbilities)
{
for (TSubclassOf<UGameplayAbility> AbilityClass : StartupAbilities)
{
// 게임플레이 어빌리티 스펙 생성
FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
if (const UAuraGameplayAbility* AuraAbility = Cast<UAuraGameplayAbility>(AbilitySpec.Ability))
{
AbilitySpec.DynamicAbilityTags.AddTag(AuraAbility->StartupInputTag);
GiveAbility(AbilitySpec);
}
}
}
기존에 초기 어빌리티를 가져와서 한 번 활성화하던 함수를 수정하여
커스텀 게임플레이 어빌리티에서 초기 입력 태그를 가져와 어빌리티에 추가하도록 한다.
2. 버튼 누름 상태에 따른 능력 제어하기
(1) AuraAbilitySystemComponent를 변수로 저장하기 - AuraPlayerController
UPROPERTY()
TObjectPtr<UAuraAbilitySystemComponent> AuraAbilitySystemComponent;
UAuraAbilitySystemComponent* GetASC();
};
UAuraAbilitySystemComponent* AAuraPlayerController::GetASC()
{
if (AuraAbilitySystemComponent == nullptr)
{
AuraAbilitySystemComponent = Cast<UAuraAbilitySystemComponent>(UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(GetPawn<APawn>()));
}
return AuraAbilitySystemComponent;
}
입력 상태에 따라 커스텀 ASC의 함수를 발동할 것이므로 커스텀 ASC를 변수로 저장하고 있는 것이 편하다.
어빌리티 시스템 블루프린트 라이브러리를 이용하면 쉽게 ASC를 가져올 수 있다.
(2) 버튼 누름 상태에 따라 능력 발동 - AuraAbilitySystemComponent
void AbilityInputTagHeld(const FGameplayTag& InputTag);
void AbilityInputTagReleased(const FGameplayTag& InputTag);
void UAuraAbilitySystemComponent::AbilityInputTagHeld(const FGameplayTag& InputTag)
{
// 입력 태그가 유효하지 않으면 종료
if (!InputTag.IsValid())
return;
for (auto& AbilitySpec : GetActivatableAbilities())
{
// 태그 컨테이너를 순회하여 입력 태그와 일치하는 어빌리티 스펙을 찾음
if (AbilitySpec.DynamicAbilityTags.HasTagExact(InputTag))
{
// 입력 확인
AbilitySpecInputPressed(AbilitySpec);
// 활성화 되어 있지 않으면 활성화
if (!AbilitySpec.IsActive())
{
TryActivateAbility(AbilitySpec.Handle);
}
}
}
}
void UAuraAbilitySystemComponent::AbilityInputTagReleased(const FGameplayTag& InputTag)
{
// 버튼을 땠을 때 종료되거나, 계속 유지됨
// 입력 태그가 유효하지 않으면 종료
if (!InputTag.IsValid())
return;
for (auto& AbilitySpec : GetActivatableAbilities())
{
// 태그 컨테이너를 순회하여 입력 태그와 일치하는 어빌리티 스펙을 찾음
if (AbilitySpec.DynamicAbilityTags.HasTagExact(InputTag))
{
// 입력 확인
AbilitySpecInputReleased(AbilitySpec);
}
}
}
버튼을 누르고 있거나 땐 상태를 판정하여 능력의 발동과 취소를 제어한다.
AbilitySpecInputPressed 함수는 어빌리티 스펙을 가져와 어빌리티를 활성화한다.
해당 함수 내의 InputPressed 함수는 abstract 이므로 오버라이드하여 원하는 대로 변경할 수 있다.
(3) 테스트 - GA_TestGameplayAbility
이제 테스트 어빌리티에 좌클릭을 할당하여 어빌리티를 발동하도록 설정한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
8-9. 코드 리펙토링 - 메세지 팝업 디버그, RPC (0) | 2024.12.05 |
---|---|
8-8. 입력 - (5) 클릭해서 캐릭터 이동하기, 길 찾기 (0) | 2024.12.05 |
8-6. 입력 - (3) 입력 버튼과 버튼 상태에 따른 함수 및 태그 바인딩 (0) | 2024.12.03 |
8-5. 입력 - (2) 액션에 어빌리티 연결 / 커스텀 입력 컴포넌트(Aura Input Component) (0) | 2024.12.03 |
8-4. 입력 - (1) 입력 설정 데이터 에셋(Input Config Data Asset) (0) | 2024.12.03 |