내배캠 TIL

[내배캠 TIL 260406] Unreal Fog of War 서버연동 정리

xodn246 2026. 4. 6. 21:15

1. 핵심 개념

Fog of War에서 네트워크의 역할은 단순하다.

 

서버는 "위치 정보만 동기화" 

클라이언트는 "시야를 직접 그린다"

렌더링을 서버에서 처리하려고 하면 비용이 폭발한다.
따라서 시야 계산과 렌더링은 완전히 클라이언트 책임으로 분리한다

 


2. 데이터 흐름 구조

서버 역할

  • 유닛 위치, 상태를 authoritative하게 관리
  • Pawn / Actor Transform 복제 (Replication)

클라이언트 역할

  • 복제된 유닛 정보 수신
  • 로컬 기준으로 시야 계산
  • Render Target에 Fog 직접 렌더링
[Server] 위치 동기화 → [Client] 로컬 유닛 필터링 → Fog 렌더링

 

 


3. 로컬 소유권 기반 필터링

모든 클라이언트는 모든 유닛을 받는다.
따라서 반드시 “내 유닛”만 골라내는 과정이 필요하다.

APawn* OwnerPawn = Cast<APawn>(VisionComp->GetOwner());

if (OwnerPawn && OwnerPawn->IsLocallyControlled())
{
    // 이 클라이언트 기준 '내 유닛'만 시야 반영
}

핵심 포인트

  • Replication 자체는 “전체 공유”
  • 시야는 “로컬 필터링”
  • 서버는 시야를 절대 계산하지 않음

 


4. 왜 IsLocallyControlled()인가

멀티플레이에서 Pawn은 다음과 같이 나뉜다.

  • Authority (서버)
  • AutonomousProxy (내 캐릭터)
  • SimulatedProxy (다른 플레이어)

IsLocallyControlled()는
AutonomousProxy만 true가 된다.

→ 즉, “내가 조작 중인 Pawn”만 정확히 식별 가능

 


5. 네트워크 안정성 고려

Fog 시스템 자체는 클라이언트 로직이지만
입력 데이터는 네트워크에 의존한다.

주의할 점

  • Replication 지연 → 시야 반영 지연
  • Pawn 소유권 변경 시 필터링 영향
  • Destroy된 Actor 참조 가능성

방어 코드

if (!IsValid(VisionComp)) continue;

APawn* OwnerPawn = Cast<APawn>(VisionComp->GetOwner());
if (!IsValid(OwnerPawn)) continue;

 

 


6. 확장 구조 (팀 기반 시야)

현재 구조는 “개인전 기준”이다.
팀 기반으로 확장하려면 Ownership 기준만 바꾸면 된다.

// 개인전
OwnerPawn->IsLocallyControlled()

// 팀전
OwnerPawn->TeamID == MyTeamID

결과

  • 아군 유닛 시야 공유
  • 거점 시야 연동 가능
  • RTS 전형 구조 완성

 


7. 네트워크 설계 핵심 요약

  • 서버는 시야를 모른다 (렌더링 X)
  • 클라이언트는 시야를 직접 계산한다
  • 모든 유닛은 공유되지만, 시야는 필터링한다

 

8. 설계 인사이트

멀티플레이에서 중요한 건
“데이터를 어디서 계산할 것인가”다.

  • 서버 → 상태 관리
  • 클라이언트 → 시각 처리

이 경계를 명확히 나누는 순간
Fog of War는 네트워크 문제가 아니라
단순한 로컬 렌더링 문제로 바뀐다.