Unreal용 6labs SDK
이 가이드에서는 6labs SDK를 Unreal Engine 게임에 통합하는 방법을 다룹니다. 플러그인 설치, 게임플레이 관찰 시작과 제어, 게임 이벤트 전송까지 설명합니다.
지원 플랫폼
6labs Unreal SDK가 현재 지원하는 플랫폼은 다음과 같습니다.
- Windows 11(DirectX 12)
사전 요구 사항
6labs SDK를 통합하기 전에 개발 환경과 프로젝트가 다음 요구 사항을 충족하는지 확인하세요:
- Unreal Engine 5.7 — 모든 5.7.x 릴리스.
- 프로젝트가 5.6.x 또는 5.8.x 등 다른 엔진 버전을 사용하는 경우 6labs 지원팀에 문의하세요.
1. 모듈 다운로드 및 가져오기
6labs SDK는 Unreal Engine 플러그인 형태로 제공됩니다.
이 모듈을 Unreal 프로젝트에 추가합니다:
- 다운로드 6labs Unreal SDK 최신 버전
v2.3.5. - 플러그인을 프로젝트의 Plugins 디렉터리(
YourProject/Plugins/SixLabsSDK/)에 압축 해제합니다. - 플러그인이 활성화되어 있는지 확인합니다:
- Unreal Editor에서 Edit > Plugins 로 이동합니다.
- “6labs SDK”를 검색하고 활성화되어 있는지 확인합니다.
- 모듈 종속성을 추가합니다
- 게임 모듈의
Build.cs에 다음을 추가합니다:PublicDependencyModuleNames.Add("SixLabsSDK");
- 게임 모듈의
2. 게임플레이 관찰 시작
StartSession() 메서드를 사용하여 게임플레이 관찰을 시작합니다. 아래 예시를 참고하세요.
// MyGameInstance.h
UFUNCTION()
void OnStartSessionComplete(ESixLabsSdkResponse Response, const FString& ErrorMessage);
// MyGameInstance.cpp
#include "SixLabsSubsystem.h"
if (USixLabsSubsystem* SixLabs = GetSubsystem<USixLabsSubsystem>())
{
FSixLabsLifecycleComplete OnComplete;
OnComplete.BindDynamic(this, &UMyGameInstance::OnStartSessionComplete);
SixLabs->StartSession(TEXT("<player_in_game_id>"), TEXT("<developer_payload>"), OnComplete);
}
void UMyGameInstance::OnStartSessionComplete(ESixLabsSdkResponse Response, const FString& ErrorMessage)
{
// Response == ESixLabsSdkResponse::SIXLABS_SUCCESS이면 StartSession()이 성공적으로 완료된 것입니다
// 결과 처리
// SixLabs->GetSdkState()로 SDK의 현재 상태를 확인할 수 있습니다
}
중요 안내
InGameId가 전달되지 않으면 관찰된 세션이 폐기될 수 있으며 AI 분석에 사용되지 않습니다. 이 값이 없으면 세션을 플레이어에게 귀속시킬 수 없으며, 이는 후속 인사이트 생성에 필요합니다.- 게임플레이 관찰을 시작하기 전에 반드시 사용자 동의를 확보해야 합니다. SDK는 자동으로 권한을 요청하지 않으므로, 동의 처리는 게임 로직에서 직접 구현해야 합니다.
- 권장되는 모범 사례로, 게임의 EULA(최종 사용자 라이선스 계약) 또는 개인정보 처리방침에 게임플레이 관찰에 대한 내용을 명시하는 것이 좋습니다.
- 올바르게 테스트하려면 플랫폼별 빌드를 생성한 후 실제 디바이스에서 실행해야 합니다. Play-In-Editor 세션에서는
StartSession()이 대신SIXLABS_ERROR_NOT_SUPPORTED와 함께OnComplete를 호출합니다. - 참고로 모든 SDK 메서드는 블루프린트에서도 호출할 수 있습니다.
참고StartSession()
void StartSession(
const FString& InGameId,
const FString& DeveloperPayload,
const FSixLabsLifecycleComplete& OnComplete);
파라미터
| 파라미터 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
InGameId |
FString |
아니요 | 선택적이지만 권장되는 사용자 식별자입니다. 생략하면 세션이 폐기될 수 있으며 AI 분석에 사용되지 않습니다. |
DeveloperPayload
|
FString |
아니요 | 세션과 연관된 선택적 개발자 정의 메타데이터입니다. 이 값은 세션 요청과 함께 원본 그대로 전달되며, 사용자 정의 추적 정보나 컨텍스트 정보를 첨부하는 데 사용할 수 있습니다. 더 풍부한 DeveloperPayload를 제공하면 AI 기반 분석 및 세션 이해의 품질을 크게 향상시킬 수 있습니다. 자세한 사용 사례와 JSON 예시는 개발자 페이로드 예시 페이지를 참고하세요.예시:
|
OnComplete |
FSixLabsLifecycleComplete |
예 | 호출이 성공하든 실패하든 완료되는 즉시 호출됩니다. 콜백 타입를 참고하세요. 블루프린트에서는 콜백 핀 연결이 선택 사항입니다. |
콜백 응답
이 콜백은 비동기로 호출되며, Response와 ErrorMessage를 통해 결과를 제공합니다.
| 응답값 | 설명 |
|---|---|
SIXLABS_SUCCESS |
세션이 성공적으로 시작되었습니다. |
SIXLABS_ERROR_STATE_NOT_IDLE |
SDK가 SDK_STATE_IDLE 상태가 아니었습니다 — 이미 세션이 실행 중이거나 일시 중지되었거나, 이전 세션이 아직 종료 중인 경우입니다. 세션을 이어가려면 ResumeSession()을 호출하세요. |
SIXLABS_ERROR_NOT_SUPPORTED |
게임플레이 관찰이 지원되지 않는 플랫폼(예: Play-In-Editor 세션)에서 StartSession()이 호출되었습니다. |
SIXLABS_ERROR_SESSION_FAILED |
요청은 수락되었지만 관찰 세션을 시작하지 못했고, SDK는 SDK_STATE_IDLE 상태로 돌아갔습니다. 이는 세션 생성 실패, 디바이스 성능 제한, 오래된 SDK 버전, 네트워크 문제, 또는 기타 초기화 오류로 인해 발생할 수 있습니다. |
3. 인게임 ID 설정
SetInGameId() 메서드를 사용하여 플레이어의 인게임 ID를 기존 관찰 세션에 연결합니다. 이 메서드는 사용자 계정이 생성되기 전에 SDK가 초기화된 경우, 로그인한 사용자를 이미 진행 중인 세션에 연결할 때 주로 사용됩니다.
if (USixLabsSubsystem* SixLabs = GetSubsystem<USixLabsSubsystem>())
{
SixLabs->SetInGameId(TEXT("<player_in_game_id>"));
}
참고
StartSession()호출 시InGameId를 전달한 경우,SetInGameId()를 호출하면 현재 세션에 설정된 기존 값이 덮어씌워집니다.
참고SetInGameId()
void SetInGameId(const FString& InGameId);
파라미터
| 파라미터 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
InGameId |
FString |
예 | 현재 세션에 연결할 플레이어의 인게임 식별자입니다. |
4. 게임 이벤트 전송
SendGameEvent() 메서드를 사용하여 진행 중인 관찰 세션에서 사용자 지정 게임플레이 이벤트를 기록할 수 있습니다. 이벤트는 세션에 첨부되며, 분석 시 특정 게임플레이 순간과 연관 짓는 데 사용할 수 있습니다.
const bool bAccepted = SixLabs->SendGameEvent(TEXT("<event_name>"), TEXT("<event_data_as_json>"));
if (!bAccepted)
{
// 이벤트가 전송되지 않았습니다. 아래 조건을 참조하세요
}
참고SendGameEvent()
bool SendGameEvent(
const FString& EventName,
const FString& EventDataJson);
파라미터
| 파라미터 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
EventName |
FString |
예 | 기록할 사용자 지정 이벤트의 이름입니다. |
EventDataJson |
FString |
예 | 이벤트와 관련된 추가 데이터를 담은 JSON 인코딩 문자열입니다. |
반환 값
| 값 | 설명 |
|---|---|
true |
이벤트가 수락되어 업로드 대기열에 추가되었습니다. |
false |
이벤트가 거부되었습니다. 예를 들어 EventName이 비어 있는 경우입니다. |
5. 고급 제어
StartSession()은 새 세션에 대한 게임플레이 관찰을 시작합니다. 이후 필요에 따라
PauseSession(),
ResumeSession(),
StopSession()을 사용하여 해당 세션을 제어할 수 있습니다.
5.1 일시 중지 (PauseSession)
PauseSession() 메서드를 사용하여 게임플레이 관찰을 일시 중지합니다.
const ESixLabsSdkResponse Response = SixLabs->PauseSession();
if (Response != ESixLabsSdkResponse::SIXLABS_SUCCESS)
{
// SDK가 관찰 중이 아니었습니다. 아래 응답을 참조하세요
}
중요 안내
- 게임플레이 관찰을 일시 중지합니다.
- 관찰을 재개하려면 이후에 다시
ResumeSession()을 호출할 수 있습니다.
참고PauseSession()
ESixLabsSdkResponse PauseSession();
반환 값
| 값 | 설명 |
|---|---|
SIXLABS_SUCCESS |
호출이 수락되어 처리되었습니다. |
SIXLABS_ERROR_STATE_NOT_CAPTURING |
SDK가 SDK_STATE_CAPTURING 상태가 아닐 때 반환됩니다 — 예를 들어 게임플레이 관찰이 진행 중이지 않거나, 세션이 이미 일시 중지되었거나, 이미 정지가 진행 중인 경우입니다. 전체 상태 및 응답 코드 목록은 세션 수명 주기를 참고하세요. |
5.2 재개 (ResumeSession)
이전에 PauseSession()으로 일시 중지된 세션을 이어가려면 ResumeSession() 메서드를 사용합니다.
// MyGameInstance.h
UFUNCTION()
void OnResumeSessionComplete(ESixLabsSdkResponse Response, const FString& ErrorMessage);
// MyGameInstance.cpp
#include "SixLabsSubsystem.h"
if (USixLabsSubsystem* SixLabs = GetSubsystem<USixLabsSubsystem>())
{
FSixLabsLifecycleComplete OnComplete;
OnComplete.BindDynamic(this, &UMyGameInstance::OnResumeSessionComplete);
SixLabs->ResumeSession(OnComplete);
}
void UMyGameInstance::OnResumeSessionComplete(ESixLabsSdkResponse Response, const FString& ErrorMessage)
{
// Response == ESixLabsSdkResponse::SIXLABS_SUCCESS이면 ResumeSession()이 성공적으로 완료된 것입니다
// 결과 처리
// SixLabs->GetSdkState()로 SDK의 현재 상태를 확인할 수 있습니다
}
참고ResumeSession()
void ResumeSession(const FSixLabsLifecycleComplete& OnComplete);
파라미터
| 파라미터 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
OnComplete |
FSixLabsLifecycleComplete |
예 | 호출이 성공하든 실패하든 완료되는 즉시 호출됩니다. 콜백 타입를 참고하세요. 블루프린트에서는 콜백 핀 연결이 선택 사항입니다. |
콜백 응답
이 콜백은 비동기로 호출되며, Response와 ErrorMessage를 통해 결과를 제공합니다.
| 응답값 | 설명 |
|---|---|
SIXLABS_SUCCESS |
세션이 성공적으로 재개되었습니다. |
SIXLABS_ERROR_STATE_NOT_PAUSED |
SDK가 SDK_STATE_PAUSED 상태가 아니었습니다 — 이어갈 일시 중지된 세션이 없는 경우입니다. |
SIXLABS_ERROR_SESSION_FAILED |
요청은 수락되었지만 일시 중지된 세션을 재개하지 못했고, SDK는 SDK_STATE_IDLE 상태로 돌아갔습니다. 이는 세션 또는 런타임 오류, 네트워크 문제, 또는 세션 재개를 방해하는 기타 오류로 인해 발생할 수 있습니다. |
5.3 정지 (StopSession)
StopSession() 메서드를 사용하여 현재 세션을 완전히 종료합니다. PauseSession()과 달리, 정지된 세션은 ResumeSession()으로 이어갈 수 없습니다 — 새 세션을 시작하려면 다시 StartSession()을 호출해야 합니다.
// MyGameInstance.h
UFUNCTION()
void OnStopSessionComplete(ESixLabsSdkResponse Response, const FString& ErrorMessage);
// MyGameInstance.cpp
#include "SixLabsSubsystem.h"
if (USixLabsSubsystem* SixLabs = GetSubsystem<USixLabsSubsystem>())
{
FSixLabsLifecycleComplete OnComplete;
OnComplete.BindDynamic(this, &UMyGameInstance::OnStopSessionComplete);
SixLabs->StopSession(OnComplete);
}
void UMyGameInstance::OnStopSessionComplete(ESixLabsSdkResponse Response, const FString& ErrorMessage)
{
// Response == ESixLabsSdkResponse::SIXLABS_SUCCESS이면 StopSession()이 성공적으로 완료된 것입니다
// 결과 처리
// SixLabs->GetSdkState()로 SDK의 현재 상태를 확인할 수 있습니다
}
참고StopSession()
void StopSession(const FSixLabsLifecycleComplete& OnComplete);
파라미터
| 파라미터 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
OnComplete |
FSixLabsLifecycleComplete |
예 | 호출이 성공하든 실패하든 완료되는 즉시 호출됩니다. 콜백 타입를 참고하세요. 블루프린트에서는 콜백 핀 연결이 선택 사항입니다. |
콜백 응답
이 콜백은 비동기로 호출되며, Response와 ErrorMessage를 통해 결과를 제공합니다.
| 응답값 | 설명 |
|---|---|
SIXLABS_SUCCESS |
호출이 수락되어 세션이 종료되었습니다. |
SIXLABS_ERROR_STATE_NOT_CAPTURING |
SDK가 SDK_STATE_CAPTURING 또는 SDK_STATE_PAUSED 상태가 아니었습니다 — 정지할 활성 세션이나 일시 중지된 세션이 없는 경우입니다. |
6. 세션 수명 주기
SDK는 다음 상태를 오갑니다. 호출할 수 있는 메서드와 그 결과는 현재 상태에 따라 달라집니다:
GetSdkState()를 사용하면 언제든 SDK의 현재 상태를 확인할 수 있으며, 반환 타입은ESixLabsSdkState입니다.StartSession(),PauseSession(),ResumeSession(),StopSession()은 유효한 SDK 상태에서만 호출할 수 있습니다. 유효하지 않은 상태에서 작업을 호출하면 오류가 반환됩니다.PauseSession()은ESixLabsSdkResponse를 직접 반환합니다.StartSession(),ResumeSession(),StopSession()은OnComplete콜백을 통해 결과를 반환합니다.OnComplete콜백은 게임 스레드에서 비동기적으로 호출됩니다.
6.1 콜백 타입
FSixLabsLifecycleComplete는 다음 두 개의 파라미터를 받는 다이내믹 델리게이트입니다:
| 파라미터 | 타입 | 설명 |
|---|---|---|
Response |
ESixLabsSdkResponse |
호출 결과이며, 응답 코드 중 하나입니다. |
ErrorMessage |
const FString& |
성공 시 비어 있으며, 실패 시 그 이유를 설명합니다. |
6.2 상태
| 상태 | 값 | 설명 |
|---|---|---|
SDK_STATE_IDLE |
100 |
게임플레이를 관찰하고 있지 않은 상태입니다. 기본 상태이며, 세션이 종료되거나 시작에 실패하면 이 상태로 돌아갑니다. |
SDK_STATE_CAPTURING |
101 |
게임플레이를 활발히 관찰하고 있는 상태입니다. 활성 세션뿐 아니라 버퍼링, 업로드 등 백그라운드 처리 과정도 포함합니다. |
SDK_STATE_STOPPING |
102 |
세션이 정지되는 중입니다. SDK가 SDK_STATE_IDLE로 돌아가기 전에 남아 있는 처리를 마무리하고 있습니다. |
SDK_STATE_PAUSED |
103 |
세션이 일시 중지된 상태입니다. 게임플레이 관찰은 잠시 중단되었지만 세션은 계속 열려 있으며, 이전에 관찰된 데이터는 계속 업로드될 수 있습니다. |
6.3 응답 코드
| 응답값 | 값 | 발생 메서드 | 대처 방법 |
|---|---|---|---|
SIXLABS_SUCCESS |
0 | 모두 | 처리할 것이 없습니다 — 호출이 정상적으로 완료되었습니다. StopSession()의 경우 세션이 종료되었습니다. |
SIXLABS_ERROR_STATE_NOT_IDLE |
1 | StartSession() |
이미 세션이 실행 중이거나, 일시 중지되었거나, 아직 종료 중입니다. GetSdkState()를 확인하고, 일시 중지 상태라면 ResumeSession()을 호출하세요. |
SIXLABS_ERROR_STATE_NOT_CAPTURING |
2 | PauseSession(), StopSession() |
SDK가 관찰 중이 아닙니다. 세션 없이도 실행될 수 있는 수명 주기 처리에서 호출된 경우라면 무시해도 됩니다. StopSession()은 일시 중지된 세션을 종료할 수도 있습니다. |
SIXLABS_ERROR_NOT_SUPPORTED |
3 | StartSession() |
이 환경에서는 게임플레이 관찰을 사용할 수 없습니다 — 현재는 Play-In-Editor 세션가 해당합니다. 재시도하지 말고 바로 반환하세요. |
SIXLABS_ERROR_STATE_NOT_PAUSED |
4 | ResumeSession() |
SDK가 일시 중지 상태가 아닙니다. 상태가 SDK_STATE_IDLE이면 대신 StartSession()을 호출하세요. |
SIXLABS_ERROR_SESSION_FAILED |
5 | StartSession(), ResumeSession() |
요청은 접수되었지만 세션을 시작하지 못했고, SDK는 SDK_STATE_IDLE로 돌아갔습니다. 이 오류는 즉시 거부가 아니라 OnComplete를 통해 전달됩니다. ErrorMessage를 기록하고 적절한 시점에 다시 시도하세요. 주요 원인은 저사양 기기, 오래된 SDK 버전, 네트워크 문제입니다. |
