* 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());
}
* 변수들에 의존성주입
* 실행 후 디버깅
feat : 적타입에 대해 만든 엑셀(data) 적용 · DongHoonYu96/GameplayAbilitySystem_Aura@4cfc714
Bisu96 committed Jun 21, 2024
github.com