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