0. 개요

이전 포스트에서 피격시 반응하는 몽타주를 재생하도록 게임플레이 이펙트와 어빌리티를 생성했다.

이제 특정 상황에서 해당 어빌리티를 활성화한다.

 

 

1. 게임플레이 어빌리티 부여 및 활성화

(1) 게임플레이 어빌리티 부여 - CharacterClassInfo

모든 적에 대해서 동일한 게임플레이 어빌리티를 부여하기 위해서 CharacterClassInfo를 사용한다.

	UPROPERTY(EditDefaultsOnly, Category = "Common Class Defaults")
	TArray<TSubclassOf<UGameplayAbility>> CommonAbilities;

 

 

(2) Aura 게임플레이 블루프린트 라이브러리

몬스터에 대해 초기 어빌리티를 부여하는 함수를 라이브러리에 구현한다.

	UFUNCTION(BlueprintCallable, category = "AuraAbilitySystemLibrary|CharacterClassDefaults")
	static void GiveStartupAbilities(const UObject* WorldContextObject, UAbilitySystemComponent* ASC);
};
void UAuraAbilitySystemLibrary::GiveStartupAbilities(const UObject* WorldContextObject, UAbilitySystemComponent* ASC)
{
	AAuraGameModeBase* AuraGameMode = Cast<AAuraGameModeBase>(UGameplayStatics::GetGameMode(WorldContextObject));
	if (AuraGameMode == nullptr)
		return;

	UCharacterClassInfo* CharacterClassInfo = AuraGameMode->CharacterClassInfo;
	for (TSubclassOf<UGameplayAbility> AbilityClass : CharacterClassInfo->CommonAbilities)
	{
		FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
		ASC->GiveAbility(AbilitySpec);
	}
}

 

 

(3) 어빌리티 부여 - AuraEnemy

void AAuraEnemy::BeginPlay()
{
    Super::BeginPlay();
    GetCharacterMovement()->MaxWalkSpeed = bHitReacting ? 0.f : BaseWalkSpeed;
    InitAbilityActorInfo();
    UAuraAbilitySystemLibrary::GiveStartupAbilities(this, AbilitySystemComponent);

 

 

(4) 어빌리티 활성화 - AuraAttributeSet

        if (LocalIncomingDamage > 0.f)
        {
            const float NewHealth = GetHealth() - LocalIncomingDamage;
            SetHealth(FMath::Clamp(NewHealth, 0, GetMaxHealth()));

            const bool bFatal = NewHealth <= 0.f;
            if (!bFatal)
            {
                FGameplayTagContainer TagContainer;
                TagContainer.AddTag(FAuraGameplayTags::Get().Effects_HitReact);

                // 부여된 어빌리티를 찾아서 활성화
                Props.TargetASC->TryActivateAbilitiesByTag(TagContainer);
            }
        }

 

 

(5) 데이터 에셋에 몬스터 공통 어빌리티 추가

 

 

(6) 어빌리티에 태그 추가, 인스턴스 정책 변경

인스턴스 정책을 Instanced Per Actor로 변경하여 어빌리티가 작동할 때마다 인스턴스를 생성하지 않고 하나의 인스턴스만 사용하여 성능 향상을 도모할 수 있다.

 

 

(7) 몽타주 종료 후 이펙트 제거 및 어빌리티 종료