강의를 보던 중 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는 하나의 함수만 등록 가능)
'Unreal Engine' 카테고리의 다른 글
| [Unreal] 🎯 Unreal Engine 멀티플레이 기초 개념: Server, Multicast, Replication (0) | 2025.05.28 |
|---|---|
| [Unreal] 전역 객체 정리 + Subsystem 이해하기 (0) | 2025.04.28 |
| [Unreal] Unreal에서의 Delegate 이해하기 (0) | 2025.04.26 |