본문 바로가기

게임프로그래밍/실습2

[실습2] 30. 게임플레이 이펙트로 어트리뷰트 초기화 하기

1. 어트리뷰트 데이터 초기값 할당하기

 

체력바도 만들고 체력 물약도 만들고 다양한 작업을 했지만 정작 체력을 구현하지는 않았다. 체력뿐 아니라 모든 어트리뷰트가 현재는 하드코딩 되어 있다.

 

이를 이제 초기화하는 방법을 알아보자.

 

캐릭터 베이스 클래스에서 초기값을 가지고 있는 게임플레이 이펙트와 이를 적용하는 함수를 만들 것이다.

 

프라이빗 섹션에 만들도록 하자.

UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Attributes")
TSubclassOf<UGameplayEffect> DefaultPrimaryAttributes;

void InitializePrimaryAttributes();

 

이제 함수를 정의할 것이다.

void AAuraCharacterBase::InitializePrimaryAttributes() const
{
    check(IsValid(GetAbilitySystemComponent()));
    check(DefaultPrimaryAttributes);
    
    const FGameplayEffectContextHandle ContextHandle = GetAbilitySystemComponent()->MakeEffectContext();
    const FGameplayEffectSpecHandle SpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(DefaultPrimaryAttributes, 1.f, ContextHandle);
    GetAbilitySystemComponent()->ApplyGameplayEffectSpecToTarget(*SpecHandle.Data.Get(), GetAbilitySystemComponent());
}

 

참고로 가장 아래구문에서 타겟에 이펙트를 적용하고 있는데 타겟이 아닌 셀프로 해도 상관없다고 한다.

 

이제 이 함수를 호출할 타이밍을 알아야 할 것이다.

 

캐릭터 클래스에서는 InitAbilityActorInfo 함수가 있다. 이곳에서 ASC를 초기화하고 있기 때문에 ASC가 널포인트가 아니라고 알 수 있다. 이곳에서 함수를 호출하자.

 

void AAuraCharacter::InitAbilityActorInfo()
{
    AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>();
    check(AuraPlayerState);
    AuraPlayerState->GetAbilitySystemComponent()->InitAbilityActorInfo(AuraPlayerState, this);
    Cast<UAuraAbilitySystemComponent>(AuraPlayerState->GetAbilitySystemComponent())->AbilityActorInforSet();
    AbilitySystemComponent = AuraPlayerState->GetAbilitySystemComponent();
    AttributeSet = AuraPlayerState->GetAttributeSet();

    if (AAuraPlayerController* AuraPlayerController = Cast<AAuraPlayerController>(GetController()))
    {
       if (AAuraHUD* AuraHUD = Cast<AAuraHUD>(AuraPlayerController->GetHUD()))
       {
          AuraHUD->InitOverlay(AuraPlayerController, AuraPlayerState, AbilitySystemComponent, AttributeSet);
       }
    }
    // 추가
    InitializePrimaryAttributes();
}
이제 에디터로 돌아가 게임플레이 이펙트를 만들고 할당해주면 된다.