PART 6 - 강의 1/3

ASC Replication Mode

GameplayEffect 복제 전략

01

세 가지 Replication Mode

Full, Mixed, Minimal

EGameplayEffectReplicationMode UENUM() enum class EGameplayEffectReplicationMode : uint8 { // 모든 GameplayEffect를 모든 클라이언트에 복제 // 싱글플레이어 또는 소규모 멀티플레이어용 Full, // Effect는 오너 클라이언트에게만 복제 // GameplayCue와 Tag는 모든 클라이언트에 복제 // 중간 규모 멀티플레이어에 적합 Mixed, // Effect 복제 없음, Cue와 Tag만 복제 // 대규모 멀티플레이어용 (MMO 등) Minimal }; // ASC에서 설정 void UMyAbilitySystemComponent::InitializeComponent() { Super::InitializeComponent(); // 플레이어는 Mixed, AI는 Minimal 사용 if (GetOwner()->IsPlayerControlled()) { SetReplicationMode(EGameplayEffectReplicationMode::Mixed); } else { SetReplicationMode(EGameplayEffectReplicationMode::Minimal); } }
모드 Effect 복제 Cue/Tag 복제 대역폭 용도
Full 모든 클라이언트 모두 높음 싱글/소규모
Mixed 오너만 모두 중간 중규모 멀티
Minimal 없음 모두 낮음 MMO
02

Full Mode 상세

완전 동기화

Full Replication Mode // Full Mode 동작 // 1. 서버에서 GameplayEffect 적용 // 2. Effect 전체 데이터를 모든 클라이언트에 복제 // 3. 클라이언트는 정확한 Effect 상태 파악 가능 // 장점: // - 완벽한 동기화 // - 클라이언트에서 정확한 쿨다운, 지속시간 표시 // - 디버깅 용이 // 단점: // - 높은 대역폭 사용 // - 100명 이상 동시 접속 시 서버 부하 // 적합한 경우: // - 싱글플레이어 게임 // - 4인 이하 코옵 게임 // - 개발/테스트 환경 UCLASS() class AMyCharacter : public ACharacter { public: AMyCharacter() { // 싱글플레이어 게임이므로 Full 사용 AbilitySystemComponent = CreateDefaultSubobject<UAbilitySystemComponent>( TEXT("AbilitySystemComponent")); AbilitySystemComponent->SetReplicationMode( EGameplayEffectReplicationMode::Full); } };
03

Mixed Mode 상세

권장 설정

Mixed Replication Mode // Mixed Mode 동작 // 1. 서버에서 GameplayEffect 적용 // 2. Effect는 오너 클라이언트에게만 복제 // 3. GameplayCue와 Tag는 모든 클라이언트에 복제 // 결과: // - 자신의 Effect는 정확히 파악 // - 다른 플레이어의 Effect 상세는 모름 // - 다른 플레이어의 시각 효과(Cue)는 볼 수 있음 // 예시: 플레이어 A가 독 버프를 받음 // - A 클라이언트: Effect 전체 정보 (남은 시간, 스택 등) // - B 클라이언트: Cue만 (독 파티클 이펙트) // 대부분의 멀티플레이어 게임에 적합 UCLASS() class AMyPlayerState : public APlayerState { public: AMyPlayerState() { // PlayerState에 ASC가 있는 경우 AbilitySystemComponent = CreateDefaultSubobject<UAbilitySystemComponent>( TEXT("AbilitySystemComponent")); // Mixed 모드 권장 AbilitySystemComponent->SetReplicationMode( EGameplayEffectReplicationMode::Mixed); // PlayerState는 항상 복제됨 bReplicates = true; } };
Mixed Mode 권장

대부분의 멀티플레이어 게임에서 Mixed 모드가 최적의 균형을 제공합니다. 자신의 정확한 상태와 다른 플레이어의 시각적 피드백을 모두 얻을 수 있습니다.

04

Minimal Mode 상세

대규모 최적화

Minimal Replication Mode // Minimal Mode 동작 // 1. 서버에서 GameplayEffect 적용 // 2. Effect 자체는 복제하지 않음 // 3. GameplayCue와 Tag만 복제 // 주의사항: // - 클라이언트에서 Effect 상태 조회 불가 // - 쿨다운/지속시간은 서버만 정확히 알음 // - UI는 별도 동기화 필요 // AI 캐릭터에 적합 UCLASS() class AMyAICharacter : public ACharacter { public: AMyAICharacter() { AbilitySystemComponent = CreateDefaultSubobject<UAbilitySystemComponent>( TEXT("AbilitySystemComponent")); // AI는 Effect 상세 정보 필요 없음 AbilitySystemComponent->SetReplicationMode( EGameplayEffectReplicationMode::Minimal); } }; // MMO에서 Minimal + 커스텀 동기화 void UMyGameInstance::SyncCooldownUI(float ServerCooldown) { // 서버에서 주기적으로 쿨다운 정보 전송 // 클라이언트 UI 업데이트 }
05

ASC 소유권 패턴

PlayerState vs Character

ASC 소유 위치 // 패턴 1: Character에 ASC (간단한 게임) // 캐릭터가 죽으면 ASC도 사라짐 UCLASS() class ASimpleCharacter : public ACharacter, public IAbilitySystemInterface { UPROPERTY() UAbilitySystemComponent* ASC; virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override { return ASC; } }; // 패턴 2: PlayerState에 ASC (권장) // 캐릭터가 죽어도 Effect 유지 // 캐릭터 교체/리스폰 시에도 상태 유지 UCLASS() class AMyPlayerState : public APlayerState, public IAbilitySystemInterface { UPROPERTY() UAbilitySystemComponent* ASC; virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override { return ASC; } }; // Character에서 PlayerState의 ASC 연결 void AMyCharacter::PossessedBy(AController* NewController) { Super::PossessedBy(NewController); if (AMyPlayerState* PS = GetPlayerState<AMyPlayerState>()) { // ASC의 Avatar를 이 캐릭터로 설정 PS->GetAbilitySystemComponent()->InitAbilityActorInfo(PS, this); } } void AMyCharacter::OnRep_PlayerState() { Super::OnRep_PlayerState(); // 클라이언트에서도 초기화 if (AMyPlayerState* PS = GetPlayerState<AMyPlayerState>()) { PS->GetAbilitySystemComponent()->InitAbilityActorInfo(PS, this); } }
PlayerState ASC 권장

캐릭터가 죽거나 교체될 때 버프/디버프가 유지되어야 한다면 PlayerState에 ASC를 배치하세요. 대부분의 게임에서 이 패턴이 더 유연합니다.

SUMMARY

핵심 요약

  • Full: 모든 Effect 복제, 싱글/소규모용
  • Mixed: 오너에게만 Effect 복제, 권장 설정
  • Minimal: Effect 복제 없음, MMO/대규모용
  • PlayerState ASC: 캐릭터 교체 시에도 상태 유지
  • AI는 Minimal: Effect 상세 정보 불필요
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: Replication Mode 비교

ASC의 ReplicationMode를 Full, Mixed, Minimal 각각으로 설정하고 stat net으로 대역폭을 비교하세요. Mixed 모드에서 소유 클라이언트와 비소유 클라이언트의 복제 차이를 관찰하세요.

실습 2: Mixed Mode 설정

Mixed 모드에서 비소유 클라이언트에 최소한의 GameplayTag만 복제되는지 확인하세요. AbilitySystemComponent::SetReplicationMode()로 런타임 전환을 테스트하세요.

심화 과제

undefined