Gameplay Ability System(GAS)은 강력한 게임 개발 프레임워크다.
Data-Driven 방식으로 각 객체간의 종속성을 최소화할 수 있고, 멀티플레이 게임을 만들 수도 있다.
하지만 단점도 있다.
그 중 하나가 유저 입력과 어빌리티를 연결하는 바인딩 방식이다. 방식이 표준화되지 않아 개발자마다 다양하게 구현한다.
여러가지 입력 바인딩 방식과 장단점을 조사했다.
InputID
를 어빌리티마다 부여한다.UENUM(BlueprintType) enum class EAbilityInputID : uint8 { None UMETA(DisplayName = "None"), Confirm UMETA(DisplayName = "Confirm"), Cancel UMETA(DisplayName = "Cancel"), Fire UMETA(DisplayName = "FireAbility"), Jump UMETA(DisplayName = "JumpAbility") }; void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); if (AbilitySystemComponent) { AbilitySystemComponent->BindAbilityActivationToInputComponent(PlayerInputComponent, FGameplayAbilityInputBinds( "Confirm", "Cancel", "EAbilityInputID", static_cast<int32>(EAbilityInputID::Confirm), static_cast<int32>(EAbilityInputID::Cancel) )); PlayerInputComponent->BindAction("FireAbility", IE_Pressed, this, &AMyCharacter::FireAbility); } }
AbilitySpec.DynamicAbilityTags
에 입력 태그를 넣어서 사용하는 방식void UMyAbilitySystemComponent::GrantInputAbility(FGameplayTag InputTag, const TSubclassOf<UGameplayAbility>& Ability) { FGameplayAbilitySpec AbilitySpec(Ability); AbilitySpec.SourceObject = GetAvatarActor(); AbilitySpec.DynamicAbilityTags.AddTag(InputTag); GiveAbility(AbilitySpec); } void UMyAbilitySystemComponent::OnAbilityInputPressed(const FGameplayTag& InputTag) { for (const FGameplayAbilitySpec& AbilitySpec : GetActivatableAbilities()) { if (AbilitySpec.DynamicAbilityTags.HasTagExact(InputTag)) { TryActivateAbility(AbilitySpec.Handle); } } }
TryActivateAbilitiesByTag()
를 실행한다.AbilityTags
를 설정해야한다.AbilityTags
변경이 불가능하다.