언리얼 네트워크와 객체 통신 이해하기

주상돈·2025년 3월 21일

TIL

목록 보기
42/53

언리얼 네트워크와 객체 통신

언리얼 Replication

❗언리얼 채팅에 앞서 우리가 네트워크를 기능을 구현하는데 필수적인 Replication이 무엇인지

그리고 어떻게 해야 올바른 접근이 가능 한지에 대해 잠시 살펴보도록 하겠습니다.

언리얼의 엔진에서 Replication이란

Network Framework API를 상속받아 구현한 구현체.

중요한 개념은 RepNotify, ActorReplication, RPCs 3개 입니다.

  1. RepNotify
    용도: 값 변경 시 서버 → 클라이언트로 이벤트 호출
    호출방법: 자동
    실행: 클라이언트
    네트워크가 연결되어 있으면 신뢰 가능
UPROPERTY(ReplicatedUsing=OnRep_HealthChanged)
int32 PlayerHealth = 100;

UFUNCTION()
void OnRep_HealthChanged();

  1. ActorReplication
  • 용도: 변수값의 동기화 및 오너쉽 관리로 서버 → 클라이언트
  • 호출방법: 자동
  • 실행: 서버에서 값 변경 후 클라이언트에 반영
  • 네트워크가 연결되어 있으면 신뢰 가능
UPROPERTY(Replicated)
int32 PlayerHealth = 100;

  1. RPCs
  • 용도: 서버와 클라이언트 간 양방향 함수 호출
  • 호출방법: 수동
  • 실행: 서버, 클라이언트
    Reliable / Unreliable 선택 가능
UFUNCTION(Server, Reliable)
void ServerFireWeapon();

UFUNCTION(NetMulticast, Unreliable)
void MulticastPlayExplosionEffect();

Listen Server와 Dedicated Server

게임에서 서버란 사용자의 데이터를 저장하는 기능 외에 게임의 심판 역할을 하는 로직 전체를 이야기한다.

언리얼에서 네트워크 멀티플레이를 구현하는 방법은 언리얼에서 제공하는 방법 외에 많은 소켓 통신, Restful API 방식 등이 있지만, 여기에서는 언리얼이 기본적으로 제공하는 Listen ServerDedicated Server에 대해서 알아보자.

1️⃣ Dedicated Server

Dedicated는 “특정 목적의”로 번역이 될 수 있다. 다시 말해 전용 서버라는 뜻으로 서버의 로직만 추려서 빌드 된 버전을 이야기한다.

  • 별도 빌드: 필요
  • 클라이언트 기능 포함: 안 함
  • 보안: 좋음
  • 용도: 독립 서버를 갖춘 게임 환경
  • 개발 난이도: 상대적으로 깔끔

2️⃣ Listen Server

Listen Server는 클라이언트 중 하나가 서버의 기능을 겸직하고 있다.

  • 별도 빌드: 불필요
  • 클라이언트 기능 포함: 네
  • 보안: 해킹에 취약
  • 용도: LAN 환경에서 근거리 그룹
  • 개발 난이도: 클라이언트와 서버의 기능이 합쳐져 있으므로 권한 체크 필수

언리얼의 객체간 통신

언리얼에서는 각각 다른 객체 간의 통신을 위해서 이벤트를 생성하고 이를 호출할 수 있습니다.

예를 들어, 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가 된다.

0개의 댓글