❗언리얼 채팅에 앞서 우리가 네트워크를 기능을 구현하는데 필수적인 Replication이 무엇인지
그리고 어떻게 해야 올바른 접근이 가능 한지에 대해 잠시 살펴보도록 하겠습니다.
언리얼의 엔진에서 Replication이란
Network Framework API를 상속받아 구현한 구현체.

중요한 개념은 RepNotify, ActorReplication, RPCs 3개 입니다.
- RepNotify
용도: 값 변경 시 서버 → 클라이언트로 이벤트 호출
호출방법: 자동
실행: 클라이언트
네트워크가 연결되어 있으면 신뢰 가능UPROPERTY(ReplicatedUsing=OnRep_HealthChanged) int32 PlayerHealth = 100; UFUNCTION() void OnRep_HealthChanged();
- ActorReplication
- 용도: 변수값의 동기화 및 오너쉽 관리로 서버 → 클라이언트
- 호출방법: 자동
- 실행: 서버에서 값 변경 후 클라이언트에 반영
- 네트워크가 연결되어 있으면 신뢰 가능
UPROPERTY(Replicated) int32 PlayerHealth = 100;
- RPCs
- 용도: 서버와 클라이언트 간 양방향 함수 호출
- 호출방법: 수동
- 실행: 서버, 클라이언트
Reliable / Unreliable 선택 가능UFUNCTION(Server, Reliable) void ServerFireWeapon(); UFUNCTION(NetMulticast, Unreliable) void MulticastPlayExplosionEffect();
Listen Server와 Dedicated Server
게임에서 서버란 사용자의 데이터를 저장하는 기능 외에 게임의 심판 역할을 하는 로직 전체를 이야기한다.
언리얼에서 네트워크 멀티플레이를 구현하는 방법은 언리얼에서 제공하는 방법 외에 많은 소켓 통신, Restful API 방식 등이 있지만, 여기에서는 언리얼이 기본적으로 제공하는 Listen Server와 Dedicated Server에 대해서 알아보자.
1️⃣ Dedicated Server
Dedicated는 “특정 목적의”로 번역이 될 수 있다. 다시 말해 전용 서버라는 뜻으로 서버의 로직만 추려서 빌드 된 버전을 이야기한다.
2️⃣ Listen Server
Listen Server는 클라이언트 중 하나가 서버의 기능을 겸직하고 있다.
언리얼에서는 각각 다른 객체 간의 통신을 위해서 이벤트를 생성하고 이를 호출할 수 있습니다.
예를 들어, PlayerController에서 상속받은 BP_Controller 라는 블루 프린트에 다음과 같은 커스텀 이벤트가 있다고 가정하자.

언리얼에서는 각각 다른 객체 간의 통신을 위해서 이벤트를 생성하고 이를 호출할 수 있습니다.
이를 호출하는 GameMode또는 Level Blueprint에서는 다음과 같이 형 변환을 하고 이를 직접 호출할 수 있다.

하지만, 이 경우 형 변환을 하게 되고, 해당 객체의 구조를 알아야 하는 문제가 있다. (강한 연결)
만약 해당 객체가 없을 경우 Null Point Exception이 일어 날 수 있기 때문에 프로그래밍에서는 강한 결합 또는 강한 객체 간 연결 을 피하는 코드가 좋은 코드로 인정받으며, 이를 위해서 언리얼은 이벤트 디스패처(Event Dispatcher)라는 기능을 지원한다.
A라는 객체에 이벤트 패처를 등록하고, B라는 객체에서 A의 이벤트를 구독하는 원리로 작동한다. 보통의 이벤트는 A가 B, C 객체에 메시지를 전달하려면, B와 C를 형 변환한 뒤 각각의 객체의 이벤트를 호출해야 한다.

이벤트 디스패처(Event Dispatcher)는 A에게 등록된 이벤트 디스패처를 B와 C가 구독하고 있다가, A의 이벤트 디스패처가 호출(Call) 됐을 때, B와 C에게 바인딩 된 이벤트를 호출하므로 빠른 처리가 가능하다.

생성한 이벤트의 Replicates 속성을 Multicast, Run on Server , Run on owning Client로 설정하면, 바로 RPC가 된다.
