본문 바로가기

게임프로그래밍/실습2

[실습2] 11. Replication Mode

 

1. Replication Mode

 

복제와 관련하여 남은 작업들을 진행하도록 하자.

 

플레이어 스테이이트 클래스의 생성자로 들어가자.

AbilitySystemComponent->SetReplicationMode()

 

레플리케이션 모드를 선택해야 한다. 모드에는 어떤 것이 있는지 살펴보자.

 

UENUM()
enum class EGameplayEffectReplicationMode : uint8
{
    /** Only replicate minimal gameplay effect info. Note: this does not work for Owned AbilitySystemComponents (Use Mixed instead). */
    Minimal,
    /** Only replicate minimal gameplay effect info to simulated proxies but full info to owners and autonomous proxies */
    Mixed,
    /** Replicate full gameplay info to all */
    Full,
};

 

위와 같이 3종류의 모드가 있고 이중 Full은 비용문제로 쓰지 않는다고 보면 된다.

 

 

복제 항목MinimalMixedFull

복제 항목 Minimal Mixed Full
효과의 ID 및 기본 정보 ✅ 복제 ✅ 복제 ✅ 복제
효과의 지속 시간(Duration) ❌ 복제하지 않음 ✅ 중요 정보만 복제 ✅ 모든 세부 정보 복제
효과의 스택 정보(Stack Count) ❌ 복제하지 않음 ✅ 중요 정보만 복제 ✅ 모든 세부 정보 복제
현재 남은 시간(Remaining Time) ❌ 복제하지 않음 ✅ 중요 정보만 복제 ✅ 모든 세부 정보 복제
효과가 발생시키는 게임플레이 태그 ✅ 복제 ✅ 복제 ✅ 복제
효과로 인한 통계 수정(Attribute Mod) ❌ 복제하지 않음 (서버 계산) ✅ 복제 (중요 수정만) ✅ 모든 수정 정보 복제
RPC를 통한 즉시 효과(Instant Effects) ❌ 복제하지 않음 (서버에서만 처리) ✅ 복제 ✅ 복제
효과 제거(Removal) 알림 ✅ 복제 ✅ 복제 ✅ 복제

 

Full의 경우 게임플레이 이펙트가 모든 클라이언트에게 복제가 된다.

Mixed의 경우 게임플레이 이펙트가 자신을 소유하고 있는 클라이언트에만 복제가 된다.

Minimal의 경우 게임플레이 이벤트가 복제되지 않는다. (정확히는 최소화된 정보만 복제된다.)

 

기본적으로 Mixed의 경우 플레이어가 Minimal의 경우 AI에 사용하면 적당한데 상황에 따라 다른 부분도 있다.

 

어쨌든 이를 바탕으로 레플리케이션 모드를 설정하자. 플레이어 스테이트와 에너미 클래스 모두 설정해주어야 할 것이다.

 

 

// PlayerState.cpp

AAuraPlayerState::AAuraPlayerState()
{
    NetUpdateFrequency = 100.f;

    AbilitySystemComponent = CreateDefaultSubobject<UAuraAbilitySystemComponent>("AbilitySystemComponent");
    AbilitySystemComponent->SetIsReplicated(true);
    
    AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Minimal);

    AttributeSet = CreateDefaultSubobject<UAuraAttributeSet>("AttributeSet");
}
AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Mixed);

 

플레이어 스테이트의 경우 Mixed로 설정하였다.

 

// Enemy.cpp

AAuraEnemy::AAuraEnemy()
{
    GetMesh()->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);

    AbilitySystemComponent = CreateDefaultSubobject<UAuraAbilitySystemComponent>("AbilitySystemComponent");
    AbilitySystemComponent->SetIsReplicated(true);
    
    AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Minimal);


    AttributeSet = CreateDefaultSubobject<UAuraAttributeSet>("AttributeSet");
}

 

AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Minimal);

 

에너미의 경우 minimal로 설정하였다.

 

 

플레이어는 게임플레이 이펙트의 지속시간이라던과  UI 피드백들이 실시간으로 이루어져야하지만 에너미의 경우 게임플레이 이펙트가 발휘되고 끝났다는 정보만 알면 충분하다. 그렇기에 위와 같이 설정하였다.