* 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
'UE5 > Gameplay Abilities' 카테고리의 다른 글
[UE5] PC 리팩토링, 클라에서 포션먹음 메시지 안뜨는 버그수정, 클라이언트 RPC (0) | 2024.06.09 |
---|---|
[UE5] Click To Move 구현 (0) | 2024.06.09 |
[UE5] Input바인딩용 클래스 생성, 클릭이벤트 발생 테스트 (0) | 2024.06.09 |
[UE5] 태그-입력 연결 구현, 런타임에 입력변경 구현준비 (0) | 2024.06.09 |
[UE5] GA 옵션들 살펴보기 (0) | 2024.06.09 |