블루프린트 클래스는 네이티브 C++ 클래스와 같은 방식으로 리플리케이트 가능합니다. 이는 시작용 특강으로, 네트워킹 게임플레이 코드에 대한 전집 튜토리얼은 아닙니다.
블루프린트에 리플리케이트 켜기
클래스에 먼저 리플리케이트 마킹을 해 줘야 합니다. 그러지 않고서 서버에 스폰되는 블루프린트 액터는 클라이언트에 스폰되지 않을 것입니다. 이 작업은 블루프린트 디폴트 안, 리플리케이션 아래서 벌어집니다:
UE4 에디터에서 멀티플레이어 테스트하기
UE4 에디터에는 멀티플레이어 게임 테스트를 위한 방식이 내장되어 있습니다. 사용하기 위해서는 Play In Editor Network 세팅에서 Number of Clients 를 2 이상의 값으로 설정해 주기만 하면 됩니다. 그런 다음 에디터에서 플레이 - 새 에디터 창 모드를 선택합니다. 그러면 각 플레이어마다 별도의 에디터 창에 실행되고, 멀티플레이어 게임에 자동으로 접속됩니다. 멀티플레어 게임플레이 테스트 및 반복처리에 가장 쉬운 방법입니다.
Authority 검사
블루프린트 로직 특정 부분은 서버에서만 돌리는 것이 중요합니다. 예를 들어 서버는 각 액터의 생명력 값에 대해 authoritative 여야 합니다. 즉 서버에서만 생명력 변경 처리를 해야 합니다. 클라이언트는 장식성 로직은 자유롭게 실행할 수 있어야 하겠지만, 자체적으로 게임플레이에 중요한 코드를 실행해서는 안됩니다.
블루프린트에서 이러한 검사를 하는 것은 간단합니다. Switch Has Authority 매크로를 사용하기만 하면 됩니다:
변수 리플리케이션
리플리케이트된 변수는 상태를 리플리케이트하는 데 사용됩니다. 리플리케이트된 변수는 서버에서 클라이언트로만 전송됩니다. 리플리케이트된 프로퍼티의 서버 값은 모든 클라이언트에 전송됩니다. 프로퍼티의 최신/현재 값만 전송됩니다. 프로퍼티를 리플리케이트되도록 만들려면, 변수 디테일 패널의 Replication 드롭다운에서 Replicated 또는 RepNotify 를 선택해 주기만 하면 됩니다.
'RepNotify' 는 변수를 평소처럼 리플리케이트시킨다는 뜻으로, 변수가 바뀌면 노티파이 이벤트가 클라이언트와 서버 양쪽에서 호출됩니다. 리플리케이트된 변수에 따라 추가적인 작업을 해 줘야 할 필요가 있을 때 유용합니다. 예를 들어, Health 는 정수로 리플리케이트해 내려보낼 수 있습니다. Health 의 RepNotify 이벤트에서는 생명령 값을 살펴본 다음 (메시 교체, 대미지 데칼 적용, 사운드 재생 등의) 장식성 대미지 이펙트를 적용할 수 있습니다. RepNotify 에 장식성 대미지를 적용하는 것이 각각의 장식성 이펙트를 개별적으로 리플리케이트하는 것보다 효율적입니다.
RepNotify 를 선택하면 함수가 블루프린트에 자동으로 추가되며, OnRep_YourVariableName 라는 이름이 붙습니다. 이 함수에 본문만 구현해 주면 자동으로 호출될 것입니다.
이벤트 리플리케이션 (RPC)
이벤트는 RPC(Remote Procedure Call)로도 리플리케이션 가능합니다. 이벤트는 한 기계에서 호출된 뒤 실행되는 다른 곳으로 리플리케이트 가능합니다. 이 기능을 사용하기 위해서는, 이벤트 그래프에 새로운 커스텀 이벤트를 만들면 됩니다. 커스텀 이벤트에 클릭한 다음 디테일 패널에서 Replication 세팅을 편집합니다:
이벤트 리플리케이션에는 세 가지 유형이 있습니다:
Multicast (멀티캐스트) 이벤트는 서버에서 호출되어 서버와 연결된 모든 클라이언트에서 실행되며, 리플리케이트되는 아무 액터에서나 호출 가능합니다. 멀티캐스트 이벤트는 모두에게 휘발성 (즉 지속적인 상태가 아닌) 이벤트 리플리케이션에 최적입니다.
서버 ('서버에서 실행되는') RPC 유형은 클라이언트에서 서버로 통신하는 블루프린트에 필요합니다. 서버 RPC 는 서버에서만 실행됩니다. 클라이언트가 커스텀 이벤트 호출을 위한 노드에 도달하면, 그 액터에서 이벤트를 실행하라고 이르는 패킷을 서버에 전송합니다. 클라이언트 자체는 이벤트를 로컬에서 실행하지 않습니다.
서버 RPC 는 이벤트 그래프를 실행하는 액터를 소유한 클라이언트에서만 호출 가능합니다. 예를 들어 PlayerPawn 이 그것을 제어하는 클라이언트에 소유된 경우, 그 클라이언트에서만 해당 폰에 서버 RPC 를 전송할 수 있습니다. 폰은 무기, 능력, 인벤토리 아이템 등 (게임에 따라 달라지는 부분을) 소유하고 있을 수도 있습니다. 이는 블루프린트에서 직접 통신하기는 어려운 개념일 수 있으므로, 차차 개선시켜 나갈 부분입니다.
클라이언트 ('소유중인 클라이언트에서 실행되는') RPC 는 소유중인 클라이언트에서만 전송됩니다. 소유중인 클라이언만 서버 RPC 를 보낼 수 있는 것과 같은 방식으로, 소유중인 클라이언트만이 서버에서 전송된 클라이언트 RPC 를 받을 것입니다.
마지막으로 블루프린트 RPC 는 신뢰성(reliable) 체크도 가능합니다. 기본적으로 블루프린트 RPC 는 비신뢰성이며, 거의 항상 비신뢰성이어야 합니다. 함수를 신뢰성으로 만드는 것은 확실히 그럴 필요가 있을 때만 해야 합니다.
블루프린트 리플리케이션 관련 질문이 있으신가요? 저희 포럼에 가셔서 소리질러 주세요! 한글 사용자를 위한 네이버 카페도 준비되어 있습니다.