1. 경험치 부여 설계
몬스터가 사망하게 되면 보유하고 있던 경험치 보상을 Attribute Set으로 전달하고, 게임플레이 이벤트를 통해 전달된 경험치 보상을 캐릭터가 수신받아 레벨에 반영한다.
이 때 게임플레이 이벤트를 수신하는 게임플레이 어빌리티를 생성하여 게임 시작할 때 플레이어 캐릭터에 부여하는 방법을 이용한다.
경험치 계산을 meta 속성을 이용하여 계산하고 이 값을 위젯에 적용하는 것 또한 또다른 목표이다.
(1) 몬스터 처치 시 XP 부여량 설정
각 몬스터 클래스에 대해 몬스터 레벨에 따른 XP 부여량을 설정
(2) 들어온 XP 메타 속성으로 계산
(3) GA_ListenForEvents 게임플레이 어빌리티를 플레이어에게 부여
- 게임플레이 이벤트에 응답하기 위해 게임플레이 이펙트를 적용
(4) 몬스터 처치 시 AttributeSet을 사용하여 XP 부여
(5) 메타 속성으로 계산한 경험치를 AttributeSet에서 받아 PlayerState에서 경험치량 증가시키기
2. 몬스터에 경험치 부여량 설정
(1) 커브 테이블 생성
캐릭터 클래스(Warrior, Ranger, Elemetalist)에 따라 경험치 양을 커브 테이블로 생성한다.
(2) CharacterClassInfo 데이터 에셋
이제 캐릭터 클래스 정보 데이터 에셋에서 각 클래스에 대해 얻을 수 있는 경험치량을 정의한다.
USTRUCT(BlueprintType)
struct FCharacterClassDefaultInfo
{
GENERATED_BODY()
// 1차 속성의 기본값을 적용하는 게임플레이 이펙트 - 공통
UPROPERTY(EditDefaultsOnly, Category="Class Defaults")
TSubclassOf<UGameplayEffect> PrimaryAttributes;
// 기본 어빌리티
UPROPERTY(EditDefaultsOnly, Category = "Class Defaults")
TArray<TSubclassOf<UGameplayAbility>> StartupAbilities;
UPROPERTY(EditDefaultsOnly, Category = "Class Defaults")
FScalableFloat XPReward = FScalableFloat();
};
(3) AuraAbilitySystemLibrary - 캐릭터 클래스와 레벨에 따르는 경험치 부여양 가져오기
static int32 GetXPRewardForClassAndLevel(const UObject* WorldContextObject, ECharacterClass CharacterClass, int32 CharacterLevel);
int32 UAuraAbilitySystemLibrary::GetXPRewardForClassAndLevel(const UObject* WorldContextObject, ECharacterClass CharacterClass, int32 CharacterLevel)
{
UCharacterClassInfo* CharacterClassInfo = GetCharacterClassInfo(WorldContextObject);
if (CharacterClassInfo == nullptr)
return;
// 레벨에 따른 경험치량 가져오기
float XP = CharacterClassInfo->GetClassDefaultInfo(CharacterClass).XPReward.GetValueAtLevel(CharacterLevel);
return static_cast<int32>(XP);
}
글로벌적으로 접근하여 캐릭터 클래스와 레벨에 따른 경험치 부여양을 가져오기 위해서 커스텀 라이브러리에 함수를 선언한다.
(4) 캐릭터 클래스 반환하기
이제 인터페이스에 접근하여 캐릭터의 클래스를 꺼내오는 함수를 선언한다.
(4-1) CombatInterface 에서 함수 선언
UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
ECharacterClass GetCharacterClass();
(4-2) 캐릭터 직업 변수 위치 조정
클래스를 반환하는 작업은 플레이어 캐릭터와 몬스터 모두 사용하므로 AuraCharacterBase에서 진행한다.
AuraEnemy에만 존재하던 클래스(직업)를 AuraCharacterBase로 옮긴다.
UPROPERTY(EditAnywhere, BlueprintReadOnly, category = "Character Class Defaults")
ECharacterClass CharacterClass = ECharacterClass::Warrior;
이제 직업군이 AuraCharacterBase로 옮겨졌으므로 Aura 캐릭터의 직업도 할당해야한다.
AuraCharacter의 생성자에 직업을 추가한다.
CharacterClass = ECharacterClass::Elementalist;
(4-3) AuraCharacterBase 에서 GetCharacterClass 함수 오버라이드
해당 인터페이스를 상속받는 클래스인 AuraCharacterBase에서 함수를 오버라이드한다.
ECharacterClass AAuraCharacterBase::GetCharacterClass_Implementation()
{
return CharacterClass;
}
(5) DA_CharacterClassInfo 에서 커브 테이블 지정
이제 각 직업의 XPReward Scalable Float에 커브 테이블을 지정한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
20-7. 경험치 - (6) 게임플레이 이벤트 발동 (0) | 2025.01.16 |
---|---|
20-6. 경험치 - (5) 이벤트를 기다리는 패시브 게임플레이 어빌리티 (0) | 2025.01.16 |
20-4. 경험치 - (3) 경험치 변화 델리게이트 바인딩 (0) | 2025.01.15 |
20-3. 경험치 - (2) 경험치, 레벨 도입 (0) | 2025.01.15 |
20-2. 경험치 - (1) 레벨업 정보 데이터 에셋 (0) | 2025.01.15 |