본문 바로가기

게임프로그래밍/실습2

[실습2] 39. 어빌리티 부여하기

1. 어빌리티 클래스 만들기

 

이제 캐릭터에게 다양한 능력들을 부여해보려고 한다. 베이스가 될 어빌리티 클래스를 만들어보자.

 

 

우리는 능력을 부여할 수 있어야 하며 이 작업은 일반적으로 서버에서 진행한다.

 

캐릭터클래스에서 캐릭터가 가질 능력들을 모을 배열을 만들 것이다. 이렇게 하면 능력들을 전부 쉽게 부여할 수 있을 것이다.

 

private:
    UPROPERTY(EditAnywhere, Category="Abilities")
    TArray<TSubclassOf<UGameplayAbility>> StartupAbilities;

 

이제 어빌리티를 부여하는 함수를 구현하자. 해당 함수는 프로텍트 영역에서 만들었다.

 

실제로 어빌리티를 부여하는건 어빌리티 시스템 컴포넌트이다. 캐릭터 클래스에서는 ASC 클래스에 있는 함수를 호출하는 작업을 할 것이다. ASC 클래스에서 함수를 구현하자.

 

void AddCharacterAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupAbilities);

 

void UAuraAbilitySystemComponent::AddCharacterAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupAbilities)
{
    for (TSubclassOf<UGameplayAbility> AbilityClass : StartupAbilities)
    {
       FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
       GiveAbilityAndActivateOnce(AbilitySpec);
    }
}

 

기본적으로는 어빌리티 스펙을 만들고 이를 적용하고 실행시키는 내장함수를 호출하면 끝이다. 물론 더 구체적으로 만들 수도 있을 것이다.

 

이제 캐릭터 클래스에서 위의 함수를 호출하자.

 

void AAuraCharacterBase::AddCharacterAbilities()
{
    UAuraAbilitySystemComponent* AuraASC = CastChecked<UAuraAbilitySystemComponent>(AbilitySystemComponent);
    if (!HasAuthority()) return;

    AuraASC->AddCharacterAbilities(StartupAbilities);

}

 

이제 다음 작업을 해야한다.

 

이 함수를 언제 호출해야할까? 캐릭터를 소유하는 시점이 가장 적절할 것이다. 물론 에너미의 경우는 또 따로 처리해야할 것이다.

 

void AAuraCharacter::PossessedBy(AController* NewController)
{
    Super::PossessedBy(NewController);

    InitAbilityActorInfo();
    AddCharacterAbilities();
    
}

 

이제 컴파일하고 잘 되는지 확인하자. 게임플레이 어빌리티를 블루프린트 클래스로 만들어야할 것이다.