언리얼 C++ 프로그래밍

[언리얼 C++] 온라인 서브시스템 데이터 타입

언린이 2021. 8. 14. 11:38

이 글에서는 온라인 서브시스템 전반에 걸쳐 사용되는 다양한 데이터 구조체에 대해 알아보도록 하겠습니다.

 

 

1. IOnlinePlatformData

IOnlinePlatformData는 인터페이스 클래스로, 그 안에 들어있는 데이터를 고려하지 않고 데이터를 전달할 수 있도록 해줍니다. 사람이 읽을 수 있는 버전의 데이터는 ToString() 함수를 통해 얻을 수 있으며, 그 이외에는 플랫폼 코드만 데이터에 직접 연산해야 할 것입니다.

 

다양한 구조체의 플랫폼 전용 표현을 종종 볼 수 있는데, 게임에서의 처리는 필요하지만 디테일을 노출시킬 필요는 없는 것을 말합니다. 이를 통해 게임이 데이터를 보유하다가 세부적인 이해 없이도 다른 플랫폼에 리플리케이트할 수 있습니다.

 

IOnlinePlatformData의 파생 클래스들은 아래와 같습니다.

  • FUniqueNetId
  • FSharedContentHandle
  • FSessionInfo

 

IOnlinePlatformData 인터페이스 클래스가 제공해주는 함수는 아래와 같습니다.

/** 
 * 불투명 데이터의 원형 바이트 표현을 구합니다.
 * 데이터는 플랫폼에 따라 달라지며, 직접 조작해서는 안됩니다.
 * @return GetSize() 의 바이트 배열 크기
 */
virtual const uint8* GetBytes() const = 0;

/** 
 * 불투명 데이터 크기를 구합니다.
 * @return 데이터 표현의 크기
 */
virtual int32 GetSize() const = 0;

/** 
 * 불투명 데이터의 유효성을 검사합니다.
 * @return 제대로 형성된 데이터면 True, 아니면 False
 */
virtual bool IsValid() const = 0;

/** 
 * 불투명 데이터의 사람이 읽을 수 있는 표현을 구합니다.
 * 로깅/디버깅 이외의 곳에 사용해서는 안됩니다.
 * @return String 형 데이터
 */
virtual FString ToString() const = 0;

 

- FUniqueNetId

FUniqueNetId에는 프로파일 서비스 온라인 ID가 들어있으며, 개별 플레이어를 나타낼 수 있으며, 친구나 세션의 무언가를 나타낼 수 있습니다.

 

- FSharedContentHandle

FSharedContentHandle에는 프로파일 서비스 공유 파일 핸들이 들어있습니다. 이 핸들은 이곳저곳 전달이 가능하며, 적절한 권한만 주어진다면 어디에서도 공유 컨텐츠에 접근하는데 사용될 수 있습니다.

 

- FSessionInfo

FSessionInfo에는 세션의 플랫폼 전용 데이터가 들어있습니다. 그 데이터는 대부분 세션 식별자, 호스트 주소, 생성된 세션을 식별하고 접속하기 위한 기타 수단 등입니다.

 

- FEmsFile

FEmsFile은 주어진 다운로드 가능 파일 관련 메타데이터입니다. 이 구조체는 주어진 서비스에서 사용할 수 있는 데이터를 열거하는데 사용됩니다.

 

FEmsFile에는 다음과 같은 요소들이 들어있습니다.

  • Hash - 주어진 파일 컨텐츠의 해시 값입니다.
  • Filename - 다운로드된 파일명입니다.
  • Logical name - 다운로드된 파일명에 매핑되는 이름입니다.
  • File size - 파일의 크기입니다.

 

- FTitleFile

FTitleFile은 온라인 서비스에서 파일을 비동기식으로 다운로드하는데 사용되는 데이터를 담는 내부 구조체입니다.

 

FTitleFile에는 다음과 같은 요소들이 들어있습니다.

  • Filename - 다운로드된 파일명입니다.
  • Async state - 다운로드된 파일의 상태입니다.
  • Data - 파일 컨텐츠가 들어있는 버퍼입니다.

 

- EOnlineAsyncTaskState

EOnlineAsyncTaskState는 비동기 작업에 가능한 상태를 나타내는 단순 Enum입니다.

/** 태스크 시작되지 않음 */
NotStarted,

/** 태스크 현재 처리중 */
InProgress,

/** 태스크 성공 */
Done,

/** 태스크 실패 */
Failed