관리 메뉴

Mini

[UE5] 적타입에 대해 만든 엑셀(data) 적용 본문

카테고리 없음

[UE5] 적타입에 대해 만든 엑셀(data) 적용

Mini_96 2024. 6. 19. 02:54

* DA를 어디에 저장?

게임모드가 적절 : 모든캐릭터가 DA 필요한건 아님, DA 1개만 저장할수 있음

class AURA_API AAuraGameModeBase : public AGameModeBase
{
    GENERATED_BODY()

protected:
    virtual void BeginPlay() override;

    UPROPERTY(EditDefaultsOnly,Category="Character Class Defaults")
    TObjectPtr<UCharacterClassInfo> CharacterClassInfo;
    
};

 

- 속성을 적용시키는 함수구현

클래스 정보가져와서 DA 가져와서

각 캐릭터클래스(전사,원소술사, 레인저)에 맞는 주요,보조, vital 속성을 적용시킴

void UAuraAbilitySystemLibrary::InitializeDefaultAttributes(const UObject* WorldContextObject, ECharacterClass CharacterClass,
    float Level, UAbilitySystemComponent* ASC)
{
    AAuraGameModeBase* AuraGameMode = Cast<AAuraGameModeBase>(UGameplayStatics::GetGameMode(WorldContextObject));
    if(AuraGameMode==nullptr) return;

    UCharacterClassInfo* CharacterClassInfo = AuraGameMode->CharacterClassInfo;
    FCharacterClassDefaultInfo ClassDefaultInfo = CharacterClassInfo->GetClassDefaultInfo(CharacterClass);
    
    const FGameplayEffectSpecHandle PrimaryAttributesSpecHandle = 
       ASC->MakeOutgoingSpec(ClassDefaultInfo.PrimaryAttributes,Level, ASC->MakeEffectContext());
    ASC->ApplyGameplayEffectSpecToSelf(*PrimaryAttributesSpecHandle.Data.Get());

    const FGameplayEffectSpecHandle SecondaryAttributesSpecHandle = 
       ASC->MakeOutgoingSpec(CharacterClassInfo->SecondaryAttributes,Level, ASC->MakeEffectContext());
    ASC->ApplyGameplayEffectSpecToSelf(*SecondaryAttributesSpecHandle.Data.Get());

    const FGameplayEffectSpecHandle VitalAttributesSpecHandle = 
       ASC->MakeOutgoingSpec(CharacterClassInfo->VitalAttributes,Level, ASC->MakeEffectContext());
    ASC->ApplyGameplayEffectSpecToSelf(*VitalAttributesSpecHandle.Data.Get());
}

 

* EnemyClass 에서 속성 적용하기

- 버츄얼 => 자식인 적에서 다르게 구현하고자 함

class AURA_API AAuraCharacterBase : public ACharacter, public IAbilitySystemInterface, public ICombatInterface
{
    ...
    virtual void InitializeDefaultAttributes() const;

- 변수추가

class AURA_API AAuraEnemy : public AAuraCharacterBase, public IEnemyInterface
{
//적의 타입이 뭔지 저장(전사, 레인저, 원소술사)
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Character Class Defaults")
ECharacterClass CharacterClass = ECharacterClass::Warrior;

- 속성적용시키는 함수 호출

void AAuraEnemy::InitializeDefaultAttributes() const
{
    UAuraAbilitySystemLibrary::InitializeDefaultAttributes(this, CharacterClass, Level, AbilitySystemComponent);
}

 

* 디버깅 에러

소스 객체를 얻어야함 전투인터를 얻으려면

- 해결 : 

각각 속성에대해

아바타액터얻고, 

ContextHandle에 아바타액터 소스객체를 추가해줌

 
void UAuraAbilitySystemLibrary::InitializeDefaultAttributes(const UObject* WorldContextObject, ECharacterClass CharacterClass,
    float Level, UAbilitySystemComponent* ASC)
{
    AAuraGameModeBase* AuraGameMode = Cast<AAuraGameModeBase>(UGameplayStatics::GetGameMode(WorldContextObject));
    if(AuraGameMode==nullptr) return;

    AActor* AvatarActor = ASC->GetAvatarActor();

    UCharacterClassInfo* CharacterClassInfo = AuraGameMode->CharacterClassInfo;
    FCharacterClassDefaultInfo ClassDefaultInfo = CharacterClassInfo->GetClassDefaultInfo(CharacterClass);
    
    FGameplayEffectContextHandle PrimaryAttributesContextHandle = ASC->MakeEffectContext();
    PrimaryAttributesContextHandle.AddSourceObject(AvatarActor);
    const FGameplayEffectSpecHandle PrimaryAttributesSpecHandle = 
       ASC->MakeOutgoingSpec(ClassDefaultInfo.PrimaryAttributes,Level, PrimaryAttributesContextHandle);
    ASC->ApplyGameplayEffectSpecToSelf(*PrimaryAttributesSpecHandle.Data.Get());

    FGameplayEffectContextHandle SecondaryAttributesContextHandle = ASC->MakeEffectContext();
    SecondaryAttributesContextHandle.AddSourceObject(AvatarActor);
    const FGameplayEffectSpecHandle SecondaryAttributesSpecHandle = 
       ASC->MakeOutgoingSpec(CharacterClassInfo->SecondaryAttributes,Level, SecondaryAttributesContextHandle);
    ASC->ApplyGameplayEffectSpecToSelf(*SecondaryAttributesSpecHandle.Data.Get());

    FGameplayEffectContextHandle VitalAttributesContextHandle = ASC->MakeEffectContext();
    VitalAttributesContextHandle.AddSourceObject(AvatarActor);
    const FGameplayEffectSpecHandle VitalAttributesSpecHandle = 
       ASC->MakeOutgoingSpec(CharacterClassInfo->VitalAttributes,Level, VitalAttributesContextHandle);
    ASC->ApplyGameplayEffectSpecToSelf(*VitalAttributesSpecHandle.Data.Get());
}

 

* 변수들에 의존성주입

 

* 실행 후 디버깅

클래스 : 전사(기본값) / 이전에 만든 곡선데이터가 잘 적용된모습
새총 적은 레인저로 타입 직접수정해주면됨

 

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/4cfc714ad6b4ae8fb9cfe859ebde24555e4f56b1

 

feat : 적타입에 대해 만든 엑셀(data) 적용 · DongHoonYu96/GameplayAbilitySystem_Aura@4cfc714

Bisu96 committed Jun 21, 2024

github.com