UDN
Search public documentation:

ReplicationInfosKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 네트워킹과 리플리케이션 > 리플리케이션 인포 (ReplicationInfo)

리플리케이션 인포 (ReplicationInfo)


문서 변경내역: James Tan 작성. 홍성진 번역.

ReplicationInfo


ReplicationInfo 는 모든 클라이언트에 자동으로 리플리케이트되는 액터입니다. 클라이언트와 서버 사이의 통신 수단을 제공합니다.

PlayerReplicationInfo


PlayerReplicationInfo 가 필요한 이유는, 클라이언트는 서버와 직접 통신할 수 있는 반면, 다른 클라이언트와는 직접 통신할 수 없기 때문입니다. 클라이언트의 PlayerController 는 오직 클라이언트를 위해서만 존재하기 때문입니다. 그러나 PlayerReplicationInfo 는 모든 클라이언트에 있으며, 서버측 변수가 바뀌면 클라이언트에서 업데이트됩니다. 고로 한 플레이어가 다른 플레이어에 대한 무언가를 알 필요가 있는 경우, 그 플레이어의 PlayerReplicationInfo 를 들여다보면 되는 것입니다.

PlayerReplicationInfoInteractionTree.jpg

변수

if (bNetDirty)

이 변수는 클라이언트와 서버가 다를 경우에 리플리케이트됩니다.
  • Score - 플레이어의 점수입니다.
  • Deaths - 플레이어가 죽은 횟수입니다.
  • PlayerName - 플레이어의 이름입니다.
  • Team - 플레이어가 속한 팀입니다.
  • bAdmin - 플레이어가 게임의 관리자인지? 입니다.
  • bIsSpectator - 플레이어가 관람자인지? 입니다.
  • bOnlySpectator - 이 플레이어는 관람만 할 수 있는지? 입니다.
  • bWaitingPlayer - 플레이어가 게임 참가 대기중인지? 입니다.
  • bReadyToPlay - 플레이어가 플레이할 준비가 되었는지? 입니다.
  • StartTime - 이 PlayerReplicationInfo 가 처음 생성된 이후 서버에서 경과된 시간입니다.
  • bOutOfLives - 플레이어의 생명 횟수가 다했는지? 입니다.
  • UniqueId - 플레이어를 고유하게 식별하기 위해 네트워크가 사용하는 ID 입니다.

if (bNetDirty && !bNetOwner)

이 변수는 클라이언트와 서버가 다를 경우, 그리고 이 PlayerReplicationInfo 가 클라이언트에 의해 소유되지 않은 경우에 리플리케이트됩니다.
  • Ping - 이 플레이어에 대해 리플리케이트된 압축 핑입니다.

if (bNetInitial)

이 변수는 첫 리플리케이션 업데이트시 리플리케이트됩니다.
  • PlayerID - 플레이어의 고유 ID 번호입니다.
  • bBot - 플레이어가 실제로 봇인지? 입니다.
  • bIsInactive - 이 PRI가 GameInfo 의 InactivePRIArray 에서 왔는지? 입니다.

GameReplicationInfo


GameReplicationInfo 가 필요한 이유는, GameInfo 는 절대 클라이언트에 리플리케이트되지 않기 때문입니다. 클라이언트는 여전히 GameInfo 관련 정보를 알고싶어하기 때문에, GameReplicationInfo 가 서버와 클라이언트에 생성됩니다. 그렇기에 GameInfo 가 업데이트되어 그 정보를 클라이언트에 알려줄 필요가 생길 때마다, GameInfo 는 그 업데이트를 GameReplicationInfo 에 푸시해 주면 되는 것입니다. 클라이언트의 GameReplicationInfo 버전이 업데이트되면, 클라이언트가 그 업데이트를 갖게 됩니다.

GameReplicationInfoInteractionTree.jpg

변수

if (bNetDirty)

이 변수는 클라이언트와 서버가 다를 때 리플리케이트됩니다.
  • bStopCountDown - 참이면 나머지 시간 카운트다운을 중지합니다.
  • Winner - 게임의 승자입니다.
  • bMatchHasBegun - 경기가 진행중인지? 입니다.
  • bMatchIsOver - 경기가 끝났는지? 입니다.

if (!bNetInitial && bNetDirty)

이 변수는 클라이언트와 서버가 다르지만, 첫 리플리케이션 업데이트는 아닐 때 리플리케이트됩니다.
  • RemainingMinute - 시간 제한 게임에서 시간을 카운트다운 하는 데 사용됩니다.

if (bNetInitial)

이 변수는 첫 리플리케이션 업데이트시 리플리케이트됩니다.
  • GameClass - 서버의 GameInfo 클래스입니다.
  • RemainingTime - 시간 제한 게임에서 시간 카운트다운 하는 데 사용됩니다.
  • ElapsedTime - 시간 제한 게임에서 시간 카운트다운 하는 데 사용됩니다.
  • GoalScore - 현재 점수입니다.
  • TimeLimit - 이 경기의 시간 제한입니다.
  • ServerName - 서버의 이름입니다.

TeamInfo


TeamInfo 는 깃발 뺏기처럼 팀 기반 게임에 사용되는 팀 구조 관련 정보를 담고 있습니다. PlayerReplicationInfo 와 흡사하게, 플레이어간 공통 데이터를 통신하는 데 사용됩니다.

TeamReplicationInfos.jpg

변수

if (bNetDirty && Role = Role_Authority)

이 변수는 클라이언트와 서버의 값이 다를 때, 그리고 데이터가 서버 출신일 때만 리플리케이트됩니다.
  • Score - 팀의 점수입니다.

if (bNetInitial && Role = Role_Authority)

  • TeamName - 팀 이름입니다.
  • TeamIndex - 팀 인덱스입니다.

리플리케이션 인포 패턴 사용 시기


  • 액터가 모든 클라이언트에 존재하지 않을 수 있을 때
    • GameInfo 가 모든 클라이언트에 존재하지 않음
    • PlayerController 는 소유중인 클라이언트에만 존재함
  • 클라이언트 끼리 통신하고 싶을 때
    • 모든 플레이어가 팀 정보를 볼 수도 있고, 팀을 전환할 수도 있음

결론


ReplicationInfo 는 클래스 인스턴스가 서버에만, 클라이언트에만, 딱 한 클라이언트에만 있을 때 생기는 문제를 해결합니다. 그런 이유로 멀티플레이어 게임 네트워크 테스팅을 초기부터 시작해야 하는 것입니다. 싱글 플레이어나 서버/클라이언트가 하나만 있을 때는 잘 돌아가던 것이, 클라이언트 수가 늘어나면서 꼬이기 시작하는 함정에 빠지는 것도 순식간입니다. 클래스 계획 단계에서부터 네트워킹을 염두에 두는 것이 개발 후기 산통을 줄이는 방법이라 하겠습니다.