Online Subsystem

정재훈·2023년 8월 16일
0

Unreal Multiplay

목록 보기
3/7

Online Subsystem 이란

같은 Lan 환경에서는 간단한 url과 local ip adress만으로도
두개의 pc를 연결해 multiplay환경을 구현할수 있지만
서로 다른 Lan에서 ip를 모르는 불특정 다수와 게임을 하는
Wan 환경에서의 multiplay의 구현 방식은 다르다.
접속한 유저들의 ip를 관리하는 dedicated 서버를 운영하거나
steam, xbox live, facebook gaming 같은 서비스 플랫폼에 접속하여 구현하게 되는데
이때 하나의 코드로 모든 서비스에 호환되도록 언리얼에서 제공하는
abstraction layer가 online subsystem이다.

Session Interface

서비스 플랫폼에서는 친구기능이나 업적, 세션등 다양한 서비스를 제공한다.
그에 따라 unreal의 online subsystem은 다양한 플랫폼에서
제공하는 서비스를 handle하기위한 다양한 interface를 제공한다.
그중 multiplay에서 플래이어가 만나기위해 가장 중요한 interface가 session interface다.

Session interface function 호출은 기본적으로 다음 과정을 따른다

  • CreateSession()
  • FindSessions()
  • JoinSession()
  • StartSession()
  • DestroySession()

Interface Delegates

delegate는 메서드 대신해서 호출해줍니다.
callback함수를 delegate에

Online Subsystem에서 delegate를사용하는 이유는 온라인 서브시스템은
근본적으로 다양한 온라인 서비스와 비동기 통신을 처리하도록 설계되었습니다.
네트워크 연결 속도, 서버 지연시간, 백엔드 서비스 실행 시간 모두 로컬 머신이 알 수 없으므로,
이 시스템과의 상호작용에 시간이 얼마나 걸릴지도 예측할 수 없습니다.
이를 처리하기 위해 온라인 서브시스템은 모든 원격 작업에 델리게이트 를 사용하여
지원되는 비동기 기능이 사용될 때마다 해당 델리게이트가 호출되도록 합니다. -ue doc-

session interface delegate를 사용하는 방법은

CreateSession()을 예로들면

  • MultiplayerSessionsSubsystem.h
FOnCreateSessionCompleteDelegate CreateSessionCompleteDelegate;
FDelegateHandle CreateSessionCompleteDelegateHandle;

먼저 delegate와 delegate handle을 선언합니다
delegate handle은 session interface delegate list 에서
delegate를 관리하고 작업이 끝나면 delegate list에서
delegate를 삭제합니다.

  • MultiplayerSessionsSubsystem.cpp
UMultiplayerSessionsSubsystem::UMultiplayerSessionsSubsystem():
	CreateSessionCompleteDelegate(FOnCreateSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnCreateSessionComplete)),

constructor에서 delegate를 construct 하고 콜백함수를 바인딩해줍니다.

  • MultiplayerSessionsSubsystem.cpp
void UMultiplayerSessionsSubsystem::CreateSession(int32 NumPublicConnections, FString MatchType)
{
	.
	.interface의 null 확인 등등
    .
    
    CreateSessionCompleteDelegateHandle = SessionInterface->AddOnCreateSessionCompleteDelegate_Handle(CreateSessionCompleteDelegate);
    .
    .session setting 등등
    .
    
    SessionInterface->CreateSession(*LocalPlayer->GetPreferredUniqueNetId(), NAME_GameSession, *LastSessionSettings)
    .
    .createSession이 실패했을경우 처리
    .
    
}

CreateSession함수에서는 delegate list에 delegate를 등록하고 session을 생성해줍니다
session이 생성완료되면 바인딩 되었던 OnCreaateSessionComplete가 호출됩니다.

  • MultiplayerSessionsSubsystem.cpp
void UMultiplayerSessionsSubsystem::OnCreateSessionComplete(FName SessionName, bool bWasSuccessful)
{
	if (SessionInterface)
	{
		SessionInterface->ClearOnCreateSessionCompleteDelegate_Handle(CreateSessionCompleteDelegateHandle);
	}

	MultiplayerOnCreateSessionComplete.Broadcast(bWasSuccessful);
}

OnCreaateSessionComplete 함수가 호출되면 등록했던 delegate handle을 비워줍니다.

MultiplayerOnCreateSessionComplete.Broadcast(bWasSuccessful);
이부분은 custom delegate인데 session이 생성 완료되었음을
delegate에 등록된 다른클래스의 메소드들에 broadcast 해주는 역할을 합니다.

profile
게임 개발 공부중!

1개의 댓글

comment-user-thumbnail
2023년 8월 16일

글 잘 봤습니다.

답글 달기