Unreal Engine

[Unreal] Multiplayer Subsystem 구조의 이해

바다랑이 2025. 4. 28. 17:23

강의를 보던 중 Subsystem에 대한 개념이 한번에 와닿지 않았기 때문에, 정리하면서 공부하고자 합니다.

위 모식도의 과정을 설명하는 글입니다.

 

1. Menu Class → Subsystem 으로 Subsystem Function을 호출합니다.

MultiplayerSessionsSubsystem->CreateSession(4, "FreeForAll");

 

2. Subsystem → Session Interface

Subsystem 안에서는 Session Interface를 사용해서 실제 서버 기능을 호출합니다.

SessionInterface->CreateSession(...);

 

Session Interface(IOnlineSessionPtr)란?

Subsystem 안에서는 실제 세션 관련 기능을 실행할 때 Session Interface를 사용합니다.

Unreal에서는 방 만들기, 찾기, 참가 등을 관리하는 기능이 기본적으로 존재하고, 이를 인터페이스로 제공해 주는데요.

이 인터페이스가 Session Interface고, 타입은 IOnlineSessionPtr 입니다.

 

  • IOnlineSession → 순수 가상 클래스 (인터페이스)
  • IOnlineSessionPtr → 그걸 가리키는 스마트 포인터(TSharedPtr)

주요 기능

  • CreateSession (방 만들기)
  • FindSessions (방 찾기)
  • JoinSession (방 참가)
  • DestroySession (방 삭제)

주요 특징

  • 직접 구현할 필요 없이, Unreal 엔진 내부의 Online Subsystem이 알아서 처리해줍니다.
  • Steam, LAN, EOS 등 다양한 네트워크 백엔드에 따라 자동으로 동작합니다.

 

3. Session Interface → Delegate 등록

그런데, 서버에 요청을 보내는 것은 비동기 작업입니다. 바로 결과를 모를 수 있겠죠. 

그래서 SessionInterface에 Delegate를 등록해 둡니다. 

"CreateSession이 끝나면 이 함수를 호출해~" 라는 느낌으로 말이죠.

 

Unreal은 Handle을 이용해서 Delegate를 관리합니다.

Handle을 이용하면 Delegate 등록을 추적할 수 있어요.

그래서 Delegate의 추가/삭제가 안전하게 이루어지도록 보장합니다.

 

OnCreateSessionCompleteDelegateHandle = 
    SessionInterface->AddOnCreateSessionCompleteDelegate_Handle(OnCreateSessionCompleteDelegate);

 

4. Callback 발생 (Session Interface → Subsystem)

서버에서 CreateSession이 끝나면, 콜백 함수를 호출하겠죠.

콜백(Callback)이란, "특정 이벤트가 끝났을 때 자동으로 호출되는 함수"를 말합니다.

보통 앞에 On이라는 네이밍 컨벤션을 사용합니다.

void UMultiplayerSessionsSubsystem::OnCreateSessionComplete(FName SessionName, bool bWasSuccessful)

 

5. Subsystem → Menu Class 

Subsystem이 알아서 내부에서 처리하고 끝나면 좋은데, Menu Class에게 성공/실패를 알려야 합니다.

그래야 Menu Class가 사용자에게 결과를 Display 하겠죠.

(ex. 네트워크가 불안정해 서버를 만들지 못했습니다.)

(ex. 서버 생성 완료!)

 

이를 위해 Subsystem 안에 커스텀 Delegate를 만들어서, Menu Class가 바인딩할 수 있게 준비합니다.

Unreal Engine에서는 이렇게 특정 클래스 외부(다른 오브젝트) 에 이벤트를 보내고 싶을 때
Dynamic Multicast Delegate를 사용합니다.

그걸 만드는 매크로가 바로 DECLARE_DYNAMIC_MULTICAST_DELEGATE 입니다.

 

DECLARE_DYNAMIC_MULTICAST_DELEGATE란?

Dynamic: Serialize되는, 즉 블루프린트에 런타임 접근 가능

Multicast: 여러 함수를 동시에 바인딩할수 있음. (DECLARE_DELEGATE는 하나의 함수만 등록 가능)