0. 개요

몬스터가 죽으면서 경험치를 부여하는 이벤트를 발동하면 감지하고 부여량을 가져오는 게임플레이 어빌리티를 생성한다.

 

 

1. 패시브 게임플레이 어빌리티

이 어빌리티는 서버에서만 실행되어 복제(Replication)이 필요가 없으며, 게임 시작 시 한번만 활성화되면 게임이 종료될 때까지 유지되어야 한다.

 

(1) 게임플레이 어빌리티 - 성능 최적화

새로운 게임플레이 어빌리티를 생성한다.

- 복제 정책(Replication Policy) : Do Not Replicate(복제 안함)

이 어빌리티는 서버에서만 작동할 것이므로 복제 안함을 선택한다.

 

- 인스턴싱 정책(Instancing Policy) : Instanced Per Actor(액터 별 인스턴스화)

이 게임플레이 어빌리티는 Aura 캐릭터 별 1회만 실행되어 게임이 끝날 때까지 유지되어야 한다.

 

- 넷 실행 정책(Net Execution Policy) : Sercer Only(서버에서만)

 

 

(2) Wait Gameplay Event 노드

특정 이벤트 태그가 들어오기 전까지 대기하는 노드이다.

정확히 일치(Only Match Exact)의 체크를 해제하면 상위 그룹에 해당하는 모든 이벤트 태그에 대해서 대기한다.

(ex) 위의 경우, Attributes.Primary, Attributes.Secondary, Attributes.Vital ...

경험치인 IncomingXP의 경우 메타 속성으로 되어있으므로 Attributes에 속한다.

 

게임의 종료 전까지 반복 실행되어야 하므로 한 번만 트리거(Only Trigger Once)의 체크를 해제한다.

 

 

(2-1) GameplayEventData

게임플레이 이벤트를 생성할때 Payload 구조체를 통해 데이터를 담아 보낼 수 있다.

Wait Gameplay Event 노드에서 해당 구조체를 분해한 후 데이터를 가져와 쓸 수 있다.

 

 

(3) 이벤트 게임플레이 이펙트 생성

게임플레이 이벤트를 게임플레이 이펙트로 생성할 것이다.

Set by Caller를 사용하여 IncomingXP 태그를 넘겨야 한다.

 

(3-1) Native 게임플레이 태그 생성

AuraGameplayTags에서 메타 속성에 관한 게임플레이 태그를 생성한다.

	FGameplayTag Attributes_Meta_IncomingXP;
	/*
	*  메타 속성
	*/
	GameplayTags.Attributes_Meta_IncomingXP = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Attributes.Meta.IncomingXP"),
		FString("IncomingXP meta Attribute")
	);

 

 

(3-2) 이벤트 게임플레이 이펙트에 태그 할당

이제 게임플레이 어빌리티가 해당 태그를 수신하게 된다.

 

 

(4) 게임플레이 어빌리티 구성

위에서 생성한 이벤트 게임플레이 이펙트를 변수로 저장한다.

 

 

(4-1) 게임플레이 이펙트 스펙 만들기

- Actor Info에서 ASC를 가져와 게임플레이 이펙트 컨텍스트를 만든다.

- 게임플레이 이펙트 컨텍스트와 게임플레이 이펙트 클래스를 이용하여 게임플레이 이펙트 스펙을 만든다.

 

(4-2) 게임플레이 이펙트 스펙 본인에게 적용

- Set by Caller를 사용하여 위에서 생성한 게임플레이 이펙트 스펙에 태그와 값을 지정한다.

- ASC에서 Apply GameplayEffect Spec to Self를 가져와 본인에게 게임플레이 이펙트를 적용한다.

 

 

2. 게임 시작 시 캐릭터에 패시브 어빌리티 부여

(1) AuraCharacterBase 에서 시작 시 활성화되는 패시브 어빌리티 배열 선언

private:
	// 시작 시 활성화되는 어빌리티
	UPROPERTY(EditAnywhere, Category="Abilities")
	TArray<TSubclassOf<UGameplayAbility>> StartupAbilities;

	// 시작 시 활성화되는 패시브 어빌리티
	UPROPERTY(EditAnywhere, Category = "Abilities")
	TArray<TSubclassOf<UGameplayAbility>> StartupPassiveAbilities;

 

 

(2) AuraAbilitySystemComponent에서 패시브 어빌리티 부여 함수

void AddCharacterPassiveAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupPassiveAbilities);
void UAuraAbilitySystemComponent::AddCharacterPassiveAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupPassiveAbilities)
{
    for (TSubclassOf<UGameplayAbility> AbilityClass : StartupPassiveAbilities)
    {
        // 게임플레이 어빌리티 스펙 생성
        FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
        GiveAbilityAndActivateOnce(AbilitySpec);
    }
}

이 패시브 어빌리티 부여 함수가 액티브 어빌리티 부여 함수와 다른점에 대해 살펴본다.

- 패시브 어빌리티는 입력이 필요 없다.

- 패시브 어빌리티는 게임이 종료될 때까지 한 번만 활성화되어 유지되면 된다.


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);
        }
    }
    bStartupAbilitiesGiven = true;
    AbilitiesGivenDelegate.Broadcast(this);
}

- 액티브 어빌리티는 입력이 필요하고, 이 프로젝트에서 입력은 태그로 전달되고 있다.

- 액티브 어빌리티는 GiveAbility 함수로 캐릭터에게 어빌리티를 부여한다.

 

 

(3) AuraCharacterBase에서 AddCharacterAbilities 함수 수정

void AAuraCharacterBase::AddCharacterAbilites()
{
	UAuraAbilitySystemComponent* AuraASC = CastChecked<UAuraAbilitySystemComponent>(AbilitySystemComponent);

	// 이 함수를 실행하는 주체가 서버인지 확인
	if (!HasAuthority())
		return;

	AuraASC->AddCharacterAbilities(StartupAbilities);
	AuraASC->AddCharacterPassiveAbilities(StartupPassiveAbilities);
}

이제 게임 시작시에 캐릭터에게 패시브 어빌리티도 부여하게 된다.

 

(4) BP_AuraCharacter에 패시브 어빌리티 추가