관리 메뉴

Mini

[UE5] 커스텀 속성계산1, 레벨 구현 본문

UE5/RPG Attributes

[UE5] 커스텀 속성계산1, 레벨 구현

Mini_96 2024. 6. 7. 02:46

1. 기획부서에서 아래와같이 최대체력 요청이 왔다고 가정

레벨은 AS가 아님 -> 커스텀 필요

 

전투인터페이스에 레벨을두면 의존성을 떨어뜨릴수 있다.

 

2. 실습

- 플레이어 : PS내의 레벨을 가짐

- 적 : 변수로 레벨을 가짐

in PS

private:
    UPROPERTY(VisibleAnywhere)
    int32 Level=1;

* 고려사항 : 복제O, 복제될때마다 방송해야됨 -> getlifetimereplicated 재정의해야함, 복제함수 생성해야함

UPROPERTY(VisibleAnywhere, ReplicatedUsing=OnRep_Level)
int32 Level=1;

UFUNCTION()
void OnRep_Level(int32 OldLevel);
void AAuraPlayerState::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);

    DOREPLIFETIME(AAuraPlayerState,Level);
}

 

3. 적한테도 레벨달아줌

복제안하는이유 : AI가 제어하는 적의 서버레벨을 확인하면됨?

UPROPERTY(EditAnywhere, BlueprintReadOnly,Category="Characer Class Defaults")
int32 Level=1;

 

4. 레벨 Getter용 Interface 생성

virtual int32 GetLevel(); //=0 아님 -> 구현강제x
int32 ICombatInterface::GetLevel()
{
    return 0; //구현안한경우, 0리턴
}

 

5. 캐릭베이스에서 interface 구현한다고 명시 => 적, 아우라캐릭터에서 구현

class AURA_API AAuraCharacterBase : public ACharacter, public IAbilitySystemInterface, public ICombatInterface
{

- 적의경우 멤버변수 그대로 리턴하면됨

int32 AAuraEnemy::GetLevel()
{
    return Level;
}

-플레이어의 경우 레벨은 PS 안에있음 (PS를 get하고, 레벨을 get하면됨)

-PS에 Getter 만들어야함 (Level이 private 이므로)

FORCEINLINE int32 GetPlayerLevel() const { return Level; }
int32 AAuraCharacter::GetPlayerLevel()
{
    AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>();
    check(AuraPlayerState);
    return AuraPlayerState->GetPlayerLevel();
    
}

 

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/26190baa8194c272463e1d3b871f6e799b7910fe

 

feat : 보조속성구현, 주요속성변경시 자동변경 · DongHoonYu96/GameplayAbilitySystem_Aura@26190ba

Bisu96 committed Jun 6, 2024

github.com