Unreal Engine에서 Hybe Game Platform Service(이하, 플랫폼, Platform) 연동을 위한 SDK 사용법에 대해서 설명합니다.
환경 구성
개발 환경
Platform SDK를 사용하기 위한 요구 사항은 아래와 같습니다.
SDK 설치
언리얼 엔진에서 Platform SDK를 사용하기 위해서는 배포된 플러그인 프로젝트 [HybePlatform] 폴더를 Plugins 폴더 하위에 복사합니다.
UnrealStarter 샘플 프로젝트
플랫폼SDK 플러그인을 이용한 언리얼 샘플 프로젝트를 제공합니다.
UnrealStarter_x.x.x.zip 파일을 압축 해제합니다.
샘플앱 프로젝트는 5.2.1 환경으로 제공됩니다.
UnrealStarter.uproject 파일에서 오른쪽을 버튼을 이용해서 Visual Studio 솔루션 파일을 생성합니다.
Visual Studio 솔루션 파일을 오픈 합니다.
UnrealStarter 샘플 실행하기
플랫폼 연동 환경 설정
Copy [HybeGamePlatform]
CustomScheme=PlatformStarter
Copy // UnrealStarterGameModeBase.cpp
std::string configJson = R"({
"BuildEnv": "qa",
"ProjectId": "XXXXX",
"ServiceId": "XXXXX"
})";
샘플 디렉토리 구조
로그인 FLOW
① - ④ 플랫폼 이벤트 리스너를 등록한다.
⑤ - ⑥ 플랫폼 초기화를 수행한다.
⑦ - ⑱ 플랫폼 로그인을 요청하고 이벤트를 처리한다.
⑪ - ⑱ 신규 회원 인 경우 웹뷰를 팝업하고 회원 가입 프로세스를 진행한다.
㉑ - ㉔ 게임 서버에 로그인 토큰을 전송하여 게임 서버에 접속한다.
㉕ 로그아웃을 요청한다.
게임 클라이언트는 플랫폼 SDK에서 전달하는 이벤트를 수신할 Agent를 구현해야 한다.
플랫폼 초기화
연동 환경 Configuration 준비
Platform에 연동하기 위해서는 전달 받은 실행 환경 JSON을 준비합니다.
Copy {
"BuildEnv": "qa",
"ProjectId": "0000",
"ServiceId": "xxx-xxxx"
}
플랫폼 Auth Agent 등록
Copy class UStarterPlatformAuthAgent : public HybePlatformAuthAgent
{
public:
virtual void OnLoginSuccess(const FString& resultJson) override;
virtual void OnLoginFailure(const FString& resultJson) override;
virtual void OnLogoutSuccess() override;
virtual void OnLogoutFailure(const FString& resultJson) override;
virtual void OnWithDraw() override;
virtual void OnMount(bool mounted) override;
virtual void OnRefreshVerifyToken(const FString& token) override;
}
다음과 같이 이벤트 핸들러를 구현합니다.
Copy // 로그인 성공시 전달되는 이벤트
void UStarterPlatformAuthAgent::OnLoginSuccess(const FString& resultJson)
{
}
// 로그인 실패시 전달되는 이벤트
void UStarterPlatformAuthAgent::OnLoginFailure(const FString& resultJson)
{
}
void UStarterPlatformAuthAgent::OnLogoutSuccess()
{
}
void UStarterPlatformAuthAgent::OnLogoutFailure(const FString& resultJson)
{
}
// 계정 탈퇴 완료시 전달되는 이벤트
void UStarterPlatformAuthAgent::OnWithDraw()
{
}
// SDK 초기화 수행시 전달되는 이벤트 핸들러
void UStarterPlatformAuthAgent::OnMount(bool mounted)
{
}
// 접속 토큰 갱신요청 시 전달되는 이벤트 핸들러
void UStarterPlatformAuthAgent::OnRefreshVerifyToken(const FString& token)
{
}
// 점검 이벤트 핸들
void UStarterPlatformAuthAgent::OnInspection()
{
}
플랫폼 초기화
플랫폼 플러그인 초기화를 수행합니다.
게임 플랫폼 멤버 이벤트를 수신할 AuthAgent 등록
게임 플랫폼 연동 과정에서 필요한 데이터를 저장할 경로 지정 (자동 로그인 등)
Copy //1. 게임플랫폼 플러그인에 Agent 및데이터 저장 경로를 등록한다.
HybePlatformAgent::Instance().SetPlatformAuthAgent(new UStarterPlatformAuthAgent());
HybePlatformAgent::Instance().SetWritableStorageDirectory(FPaths::ProjectSavedDir());
//2. 설정 정보와 함께 플랫폼 초기화를 시도한다.
std::string configJson = R"({
"BuildEnv": "qa",
"ProjectId": "XXXXX",
"ServiceId": "XXXXX"
})";
//3. 클라이언트 언어 설정
HybePlatformAgent::Instance().SetClientLanguage(TEXT("ko"));
GetClientContext().SetClientLanguage(TEXT("ko"));
//4. 플랫폼 SDK 초기화
HybePlatformAgent::Instance().Mount(FString(configJson.c_str()));
초기화 이벤트 핸들러
Copy void UStarterPlatformAuthAgent::OnMount(bool mounted)
{
if (mounted)
{
// 초기화 성공
// 로그인 UI를 화면에 출력하거나 자동 로그인을 수행한다.
}
}
플랫폼 로그인(공통)
플랫폼 로그인은 3가지 단계로 수행됩니다.
구글/애플/이메일 등 인증 수단을 이용한 Signin
웹뷰 Agent 추가
로그인 프로세스에서 필요한 회원 가입, 서비스 이용 동의, 본인 확인 등의 과정에서 웹뷰를 통해 진행됩니다. SDK는 웹뷰가 필요한 경우에 등록된 웹뷰 Agent로 Show/Close 이벤트를 전달합니다.
플랫폼 SDK는 웹뷰를 직접 제공하지 않습니다.
인게임에서 사용하는 웹뷰를 이용해서 로그인 프로세스를 연동할 수 있습니다.
언리얼에서 제공하는 WebBrowser 플러그인을 이용한 가이드를 제공합니다.
Copy class UStarterPlatformWebviewAgent : public HybePlatformWebviewAgent
{
public:
virtual void OnCloseWebview() override;
virtual void OnShowWebview(const FString& url) override;
};
Copy // 웹뷰 Close가 필요할 때 전달되는 이벤트
void UStarterPlatformWebviewAgent::OnCloseWebview()
{
}
// 웹뷰 팝업이 필요할 때 전달되는 이벤트
void UStarterPlatformWebviewAgent::OnShowWebview(const FString& url)
{
}
언리얼 커스텀 웹뷰 추가
Settings > Plugins 에서 WebBrowser를 사용하도록 체크합니다.
언리얼에서 제공하는 Web Browser 플러그인을 상속 받는 커스텀 웹뷰를 추가합니다.
Copy class ULoginWebBrowser : public UWebBrowser
{
GENERATED_BODY()
public:
void OnConsoleLog(const FString& Message, const FString& Source, int32 Line, EWebBrowserConsoleLogSeverity Severity);
void OnHandleOnUrlChanged(const FText& InText);
void ShowWebview(const FString& url);
void CloseWebview();
protected:
virtual TSharedRef<SWidget> RebuildWidget() override;
};
Copy #define LOCTEXT_NAMESPACE "LoginWebBrowser"
/**
* @brief 웹뷰에서 호출한 console.log 호출시 수신되는 이벤트
*/
void ULoginWebBrowser::OnConsoleLog(const FString& Message, const FString& Source, int32 Line, EWebBrowserConsoleLogSeverity Severity)
{
UE_LOG(LogTemp, Warning, TEXT("Console(%d, %s) : %s"), Line, *FPaths::GetCleanFilename(Source), *Message);
}
void ULoginWebBrowser::OnHandleOnUrlChanged(const FText& InText)
{
// 웹뷰 url 변경 이벤트를 플랫폼 SDK에 전달합니다.
FString url = InText.ToString();
HybePlatformAgent::Instance().GetWebviewAgent()->OnUrlChanged(url);
}
void ULoginWebBrowser::ShowWebview(const FString& url)
{
WebBrowserWidget->LoadURL(url);
SetVisibility(ESlateVisibility::Visible);
}
void ULoginWebBrowser::CloseWebview()
{
WebBrowserWidget->LoadURL("about:blank");
SetVisibility(ESlateVisibility::Hidden);
// 웹뷰가 닫힌 경우, 플랫폼에게 웹뷰 닫힘을 알립니다.
HybePlatformAgent::Instance().GetWebviewAgent()->OnNotifyWebviewClose();
}
TSharedRef<SWidget> ULoginWebBrowser::RebuildWidget()
{
if (IsDesignTime())
{
return SNew(SBox)
.HAlign(HAlign_Center)
.VAlign(VAlign_Center)
[
SNew(STextBlock)
.Text(LOCTEXT("Web Browser", "Web Browser"))
];
}
else
{
WebBrowserWidget = SNew(SWebBrowser)
.InitialURL(InitialURL)
.ShowControls(false)
.SupportsTransparency(bSupportsTransparency)
.OnUrlChanged(BIND_UOBJECT_DELEGATE(FOnTextChanged, OnHandleOnUrlChanged))
.OnBeforePopup(BIND_UOBJECT_DELEGATE(FOnBeforePopupDelegate, HandleOnBeforePopup))
.OnConsoleMessage(BIND_UOBJECT_DELEGATE(FOnConsoleMessageDelegate, OnConsoleLog));
return WebBrowserWidget.ToSharedRef();
}
}
웹뷰 언리얼 오브젝트 바인딩
웹뷰와 플랫폼 SDK 커뮤니케이션에 필요한 언리얼 오브젝트 바인딩을 적용합니다.
약관동의, 본인인증 등의 웹뷰를 이용한 로그인 과정에서 웹뷰에서 실행되는 JavaScript와 언리얼 엔진과 통신을 위해서 언리얼 오브젝트 바인딩이 필요합니다.
커스텀 웹뷰에 바이딩 기능을 추가합니다.
Copy class ULoginWebBrowser : public UWebBrowser
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void PostMessage(FString jsonResponse);
void PrepareJsBridge();
--- 중 략 ---
};
Copy
// 웹뷰에 webbridge 객체 바인딩
// 웹뷰 자바스크립트에서 webbridge를 이용해서 언리얼에 이벤트를 전달할 수 있다.
void ULoginWebBrowser::PrepareJsBridge()
{
FString linkName = TEXT("webbridge");
WebBrowserWidget->BindUObject(linkName, this, true); //true : URL이 변경되어도 계속 바이딩 유지
}
// JavaScript -> Unreal 함수 호출을 처리하는 핸들러
void ULoginWebBrowser::PostMessage(FString jsonMethod)
{
HybePlatformAgent::Instance().GetWebviewAgent()->EvalMethod(jsonMethod, [this](const FString& resultJson) {
if (resultJson.IsEmpty() == false)
{
FString js = FString::Printf(TEXT("window.unityEventHandler(%s);"), *resultJson);
ExecuteJavascript(js);
}
});
}
void ULoginWebBrowser::OnHandleOnUrlChanged(const FText& InText)
{
FString url = InText.ToString();
HybePlatformAgent::Instance().GetWebviewAgent()->OnUrlChanged(url);
}
언리얼 Web Browser에서 제공하는 BindUObject 함수를 사용해서 언리얼 오브젝트로 브라우저에서 실행되는 JavaScript가 이벤트를 전달 할 수 있도록 연결하는 과정입니다.
웹뷰의 url이 변경될 때마다 바인딩을 새로 업데이트해야 합니다.
BindUObject (linkName, this, true ) 로 설정해서 자동으로 url 변경 시 바인딩 유지되도록 구현할 수 있습니다.
웹뷰 오브젝트 바인딩 설정
WebBrowser 위젯 생성 후 웹뷰 언리얼 오브젝트 바이딩을 명시적으로 호출합니다.
Copy class ULoginWidget : public UUserWidget
{
UPROPERTY(meta = (BindWidget))
class ULoginWebBrowser* loginWebview;
}
void ULoginWidget::NativeConstruct()
{
Super::NativeConstruct();
// 웹뷰 언리얼 오브젝트 바인딩
if (loginWebview != nullptr)
{
loginWebview->PrepareJsBridge();
CloseWebview();
}
}
웹뷰 Agent 등록
추가된 웹뷰 Agent를 플랫폼 초기화(Mount) 실행 전에 SDK에 등록합니다.
Copy // Auth Agent 등록
HybePlatformAgent::Instance().SetPlatformAuthAgent(new UStarterPlatformAuthAgent());
// 웹뷰 Agent 등록
HybePlatformAgent::Instance().SetPlatformWebviewAgent(new UStarterPlatformWebviewAgent());
Custom URI Scheme 등록
Copy [HybeGamePlatform]
CustomScheme=PlatformStarter
플랫폼 로그인
플랫폼 로그인을 프로세스를 실행합니다.
지원하는 로그인 수단은 다음과 같습니다.
Google, Apple, LINE, Steam, Email, Guest, Facebook
로그인 이벤트 수신
Copy void UStarterPlatformAuthAgent::OnLoginSuccess(const FString& resultJson)
{
// 로그인 성공
}
void UStarterPlatformAuthAgent::OnLoginFailure(const FString& resultJson)
{
// 로그인 실패
}
웹뷰 사이즈 가이드
PC 웹뷰 와 전체화면이 아닌 모바일 웹뷰 는 웹뷰 내부 컨텐츠 내용을 정상적으로 표시 하기 위해 사이즈 가이드를 지켜 주셔야 합니다 .
<Horizontal 및 PC 기준>
가로 (68%): WebView의 Size.X를 0.68
(Percent 또는 Fill 기준)
세로: 디바이스 전체 높이 - 홈 인디케이터 영역 - (16px * 2)
(상하 Gutter)
<Vertical 기준>
가로 (90%): WebView의 Size.X를 0.9
세로: 디바이스 전체 높이 - 상태 바 - 홈 인디케이터 영역 - (16px * 2) - 60px
(추가 마진)
Copy float HomeIndicatorHeight = 34.0f; // 홈 인디케이터 영역 높이, iPhone 기준 예시
float StatusBarHeight = 44.0f; // 상태바 높이 (OS에 따라 다름)
플랫폼 로그인(스팀)
스팀 로그인은 아래 설정이 추가적으로 필요합니다.
Copy std::string configJson = R"({
--- 중략 ---
"SteamIdentity": "XXXXX",
})";
INI에 연동할 스팀 AppID를 등록합니다.
Copy [HybeGamePlatform]
SteamAppId=1234
Build.cs 스팀 dll 런타임 설정
게임 프로젝트의 xxxx.Build.cs 에 스팀 연동에 필요한 dll 이 배포되도록 RuntimeDependencies를설정합니다.
Copy if (Target.Platform == UnrealTargetPlatform.Win64)
{
RuntimeDependencies.Add("$(BinaryOutputDir)/steam_api64.dll", "$(ProjectDir)/Plugins/HybePlatform/Source/ThirdParty/Steam/lib/x64/steam_api64.dll");
RuntimeDependencies.Add("$(BinaryOutputDir)/steam_agent.dll", "$(ProjectDir)/Plugins/HybePlatform/Source/ThirdParty/PlatformSDK/lib/x64/steam_agent.dll");
}
스팀 로그인
STEAM 로그인 수단으로 플랫폼 로그인을 요청합니다.
Copy HybePlatformAgent::Instance().Login("STEAM", false);
플랫폼 로그인(Android)
연동 Configuration 설정
안드로이드 로그인은 아래 설정이 추가적으로 필요합니다.
Copy std::string configJson = R"({
--- 중략 ---
"WebClientId": "xxx-xxxx-xxx",
})";
로그인
플랫폼 로그인을 요청합니다.
Copy HybePlatformAgent::Instance().Login("GOOGLE", false);
앱 사이닝(Signing)
앱 빌드시 사이닝이 적용되도록 설정합니다.
Project Settings > Platforms > Android > Distribution Signing 에 사이닝에 필요한 키스토어 및 정보를 입력합니다.
플랫폼 로그인(iOS)
게스트 로그인
Guest 계정은 임시 회원으로 특정 서비스만 사용할 수 있는 계정입니다.
Copy HybePlatformAgent::Instance().Login("GUEST", false);
일반 회원 전환
Guest 계정에 일반 인증 수단을 연결 시 일반 계정으로 전환됩니다.
Copy FString signinMethod(TEXT("GOOGLE"));
HybePlatformAgent::Instance().ConvertMember(signinMethod, TEXT(""), [](FString resultCode) {
if (result == HybePlatform::ResultCode::SUCCESS)
{
// 일반 계정 전환 완료
}
});
자동 로그인
플랫폼 로그인 단계에서 자동 로그인 지원 여부를 설정 할 수 있다.
Copy bool bSupportAutoLogin = true;
HybePlatformAgent::Instance().Login("GOOGLE", bSupportAutoLogin);
Copy HybePlatformAgent::Instance().DoAutoLogin([this](bool bAutoLogin) {
});
Copy void UStarterPlatformAuthAgent::OnMount(bool mounted)
{
if (mounted)
{
HybePlatformAgent::Instance().DoAutoLogin([this](bool bAutoLogin) {
if (bAutoLogin)
{
// 자동 로그인 성공
}
else
{
// 자동 로그인 실패 : 로그인 정보 없는 경우
}
});
}
}
플랫폼 로그아웃
플랫폼 로그아웃을 요청합니다.
Copy HybePlatformAgent::Instance().Signout();
로그인 수단을 변경하기 위해서는 로그 아웃 성공 이후에 다시 로그인을 요청할 수 있습니다.
로그 아웃은 언제 호출하는가?
타이틀 이동 후 다른 계정으로 다시 로그인 하는 경우
탈퇴
계정 탈퇴를 요청합니다.
Copy HybePlatformAgent::Instance().Withdraw();
Copy void UStarterPlatformAuthAgent::OnWithDraw()
{
// 탈퇴된 계정은 Signout()으로 로그아웃할 수 없다.
HybePlatformAgent::Instance().ForceSignout();
}
푸시 연동
모바일 환경에서 Firebase Cloud Messaging(이하 FCM) 연동 기능을 제공합니다.
Android
google-services.json 파일을 Plugins 폴더에 복사합니다.
Copy Plugins\HybePlatform\Source\HybePlatform\Build\Android\google-services.json
UPL.xml 에 google-services 패키지를 지정합니다.
게임 프로젝트의 UPL.xml에 gradle 설정을 아래와 같이 추가합니다.
Copy <buildscriptGradleAdditions>
<insert>
dependencies {
classpath 'com.google.gms:google-services:4.3.15'
}
</insert>
</buildscriptGradleAdditions>
google-services 버전은 JDK 또는 firebase 지원에 적합한 버전을 지정해야 합니다.
점검
Copy void UStarterPlatformAuthAgent::OnInspection()
{
}
로그 연동
게임 클라이언트는 플레이 과정에서 발생하는 유저의 행동 로그를 수집하여 전달해야 합니다. 전달하는 로그의 명세는 별도로 전달되는 로그 명세서를 참고하세요.
로그 전송 과정은 2 단계로 구분할 수 있습니다.
로그 데이터(JSON) 수집
로그 JSON은 로그 명세서를 참고하여 직접 생성하거나, 플러그인에서 제공하는 기능을 사용할 수 있습니다.
각 프로젝트 별로 로그 JSON을 생성하는 별도의 기능이 있는 경우 사용하면 됩니다.
로그 속성 종류
로그 JSON 생성시 현재 시간(UTC)으로 자동 추가(ISO8601)
아래 포맷의 JSON 로그를 생성하는 경우
Copy {
"log_type": "LOGIN_COMP",
"os_type" : 1,
"service_id" : "10060000",
"external_device_type" : 0,
"external_device_id" : "b845158f4d599d791ca22790151cd473",
"cre_time" : "2024-06-13T08:02:27.014000Z"
}
공통 속성 등록
Copy Lognetic().SetCommon(TEXT("os_type"), 1);
Lognetic().SetCommon(TEXT("service_id"), TEXT("10060000"));
Lognetic().SetCommon(TEXT("external_device_type"), 0);
Lognetic().SetCommon(TEXT("external_device_id"), FPlatformMisc::GetLoginId());
개별 속성 등록
Copy LogneticEvent()
.Set(TEXT("log_type"), TEXT("LOGIN_COMP"))
로그 JSON 생성
JSON 생성 시 등록된 공통 속성과 생성 시간(cre_time) 속성이 자동으로 추가 됩니다.
Copy FString logJson = LogneticEvent()
.Set(TEXT("log_type"), TEXT("LOGIN_COMP"))
.ToJson();
로그 JSON 생성 및 전송
Send() 메소드는 JSON을 생성 한 후 로그 서버로 전송을 수행합니다.
1개의 로그를 전송 하는 경우에 사용합니다.
중첩 구조 로그를 생성하는 경우
Copy {
"log_type": "LOGOUT",
"os_type": 1,
"service_id": "10060000",
"external_device_type": 0,
"external_device_id": "b845158f4d599d791ca22790151cd473",
"cre_time": "2024-06-13T08:02:27.015000Z",
"online_play": {
"play_cnts": 5,
"play_details": [
{
"dungeon_type": "10",
"dungeon_id": "1",
"scale": 2
},
{
"dungeon_type": "20",
"dungeon_id": "2",
"scale": 5
}
]
}
}
Copy LogneticEvent logoutLog;
logoutLog.Set(TEXT("log_type"), TEXT("LOGOUT"));
auto& onlinePlay = logoutLog.AddObject(TEXT("online_play"));
onlinePlay.Set(TEXT("play_cnts"), 5);
onlinePlay.AddArray(TEXT("play_details")) // online_play/play_details[0]
.Set(TEXT("dungeon_type"), TEXT("10"))
.Set(TEXT("dungeon_id"), TEXT("1"))
.Set(TEXT("scale"), 2);
onlinePlay.AddArray(TEXT("play_details")) // online_play/play_details[1]
.Set(TEXT("dungeon_type"), TEXT("20"))
.Set(TEXT("dungeon_id"), TEXT("2"))
.Set(TEXT("scale"), 5);
logoutLog.Send();
JSON 로그 전송
1개 이상의 수집한 로그를 전송하는 기능을 제공합니다.
단일 로그를 생성하면서 전송하는 경우
LogneticEvent 사용
Copy LogneticEvent()
.Set(TEXT("log_type"), TEXT("LOGIN_COMP"))
.Send();
LogneticAgent 사용
Copy FString logJson = LogneticEvent()
.Set(TEXT("log_type"), TEXT("LOGIN_COMP"))
.ToJson();
Lognetic().SendEvent(logJson)
1개 이상 로그를 전송하는 경우
Copy FString logJson = LogneticEvent()
.Set(TEXT("log_type"), TEXT("LOGIN_COMP"))
.ToJson();
FString logJson2 = LogneticEvent()
.Set(TEXT("log_type"), TEXT("LOGOUT"))
.ToJson();
TArray<FString> logs = {logJson, logJson2};
Lognetic().SendEvent(logs)
API Reference
Copy {
"BuildEnv": "qa",
"ProjectId": "0000",
"SteamAppID": 00000000,
"SteamIdentity": "sample-qa-00000000"
}
기술PM에게 전달 받은 구글 WebClientID
기술PM에게 전달 받은 BillingAuth 키
Custom URI Scheme
Google, Apple 같은 Third Party Login 결과는 Custom URI Scheme 으로 앱으로 전달됩니다.
각 앱 별로 공유한 URI Scheme 을 지정해야 합니다.
DefaultEngine.ini에 HybeGamePlatform 항목에 설정하면 Windows/Android/iOS 앱 빌드 시 Custom URI Schem 이 자동 적용 됩니다.
Copy [HybeGamePlatform]
CustomScheme=PlatformStarter
URI Scheme 이름 은 반드시 알파벳으로 시작 해야 하며, 소문자/숫자/+
, -
, .
만 허용됩니다.
예: myapp+v1://
은 유효하지만, 1app://
은 허용되지 않습니다
게임 플랫폼의 서비스를 제공하는 메인 클래스로 결제 기능을 제외한 게임 플랫폼이 제공하는 대부분의 기능을 제공됩니다
Mount
플랫폼 SDK 플러그인 초기화를 수행합니다.
Copy void HybePlatformAgent::Mount(const FString& configJson) const
파라미터
Copy void UMyGamePlatformAuthAgent::OnMount(bool mounted)
{
UE_LOG(LogTemp, Warning, TEXT("Platform Mounted : %d"), mounted);
}
Login
플랫폼 로그인을 수행합니다.
Copy void Login(const FString& signinMethod, bool bEnableAutologin) const
파라미터
signinMethod 로그인 종류.
STEAM, GOOGLE, APPLE, LINE, 이메일(IM), GUEST, FACEBOOK
bEnableAutologin 자동 로그인 적용 여부
bEnableAutologin 를 true로 설정하면 자동 로그인에 필요한 정보가 로컬에 저장됩니다.
Copy HybePlatformAgent::Instance().Login(TEXT("STEAM"), false);
DoAutoLogin
자동 로그인을 실행합니다.
Copy void DoAutoLogin(std::function<void(bool)> callback) const
파라미터
Copy HybePlatformAgent::Instance().DoAutoLogin([this](bool bAutoLogin) {
if (bAutoLogin)
{
// 자동 로그인 시도
}
else
{
// 자동 로그인 실패 : 로그인 정보 없는 경우
}
});
Signout
플랫폼 로그 아웃을 수행합니다.
파라미터
ForceSignout
플랫폼 SDK의 로그인 정보를 강제로 초기화 합니다.
Copy void ForceSignout() const
파라미터
ConvertMember
게스트 회원을 일반 회원으로 전환합니다.
Copy void ConvertMember(const FString& signinMethod, const FString& yyyyMMdd, std::function<void(FString)> callback) const
파라미터
signinMethod 로그인 종류.
STEAM, GOOGLE, APPLE, LINE, 이메일(IM)
yyyyMMdd (optional) 생년월일. 게스트에 대한 생년월일을 저장하고 있는 경우 제공합니다.
callback 입력받은 생년월일 yyyyMMdd ex)20021010
ShowRequireGuestBirthDay
생년월일을 입력하는 웹뷰를 팝업합니다.
Copy void ShowRequireGuestBirthDay(std::function<void(FString)> callback) const
파라미터
callback 입력 결과를 수신하는 콜백, 취소하는 경우 빈 문자열
yyyyMMdd 문자열이 전달됩니다. ex)20021010
RefreshVerifyToken
로그인 토큰을 갱신합니다.
Copy void RefreshVerifyToken() const
파라미터
플랫폼 로그인 성공 후에 전달 받은 LoginToken 을 갱신합니다.
로그인 성공 후 발급 받은 토큰은 1시간 동안 유효합니다. 로그인 토큰은 게임 서버로 전달되어 게임 서버가 플랫폼 백엔드 인증에 사용합니다.
다음 경우에 RefreshVerifyToken으로 로그인 토큰을 갱신 해야 합니다.
로그인 성공 이후 게임 서버에 로그인 토큰을 즉시 전달하지 않는 경우
예를 들어, 로그인 후 [게임 시작] 클릭 후 게임 서버에 접속하는 경우 유저가 로그인 후 오랜 시간 자리를 비우고 [게임 시작]을 진행하면 만료된 로그인 토큰이 게임 서버에 전달되어 인증이 실패할 수 있습니다.
클라이언트가 게임 서버와 접속을 끊고 다시 게임 서버에 접속하는 경우
클라이언트가 비정상 상황에서 게임 서버와 접속이 강제로 끊긴 후 다시 게임 서버에 접속하는 경우
예를 들어, 로비로 튕긴 후 다시 게임 서버에 접속하는 경우
Withdraw
계정 탈퇴를 요청합니다.
Copy void Withdraw() const;
파라미터
Copy void UStarterPlatformAuthAgent::OnWithDraw()
{
// 탈퇴된 계정은 Signout()으로 로그아웃할 수 없다.
HybePlatformAgent::Instance().ForceSignout();
}
GetLocationCode
현재 사용자의 접속 국가 코드를 반환합니다
Copy FString GetLocationCode() const
파라미터
리턴
ISO 3166-1 alpha-2 국가 코드, ex) KR, US
SetClientLanguage
게임 클라이언트에서 사용하는 언어를 SDK에 전달합니다.
설정된 언어 정보를 이용해서 플랫폼 연동 과정에서 출력되는 웹뷰의 다국어가 적용됩니다.
Copy void SetClientLanguage(const FString& language) const
파라미터
language ISO 639-1 언어코드( ko, en, ja, zh-tw). 웹뷰에 보여지는 컨텐츠는 지원 국가 외에는 영문(en)으로 출력 됩니다.
SetWritableStorageDirectory
SDK에서 로컬에 데이터를 저장할 경로를 설정합니다.
Copy void SetWritableStorageDirectory(const FString& dir) const
파라미터
지정된 경로에 자동 로그인, 결제 정보 등이 저장됩니다.
Copy //언리얼 제공 쓰기가능 폴더 지정
FString dir = FPaths::ProjectSavedDir();
HybePlatformAgent::Instance().SetWritableStorageDirectory(dir);
GetSteamInfo
SDK에서 로컬에 데이터를 저장할 경로를 설정합니다.
Copy HybePlatform::SteamInfo GetSteamInfo() const
리턴
Copy class SteamInfo
{
public:
UINT64 Id; // User ID
FString Language; // (결제)스팀 API 호출시 사용되는 언어코드(ISO 639-1)
FString Currency; // (결제)통화코드 ex) KRW, USD
INT AppBuildId; // 앱 빌드ID
};
GetAgreementStatus
약관 동의 정보를 조회합니다.
Copy static void GetAgreementStatus(std::function<void(HybePlatform::AgreementPayload)> callback)
리턴
AgreementPayload
Copy class AgreementPayload
{
public:
bool advertising; // 마케팅 수신 동의
bool adPush; // 앱 푸시 수신 동의
bool adNightPush; // 야간 푸시 수신 동의
};
UpdateAgreement
약관 동의 정보를 업데이트합니다.
Copy static void UpdateAgreement(const HybePlatform::AgreementPayload& agreementPayload, std::function<void(bool, HybePlatform::AgreementPayload)> callback)
파라미터
리턴
callback 약관 동의 정보 수신 콜백
AgreementPayload 업데이트 된 약관 동의 결과
업데이트 요청한 약관 정보와 백엔드에 반영된 약관 동의 정보를 다를 수 있습니다.
예를 들어, 마케팅 정보 동의(advertising) 속성이 false 로 되어있으면 푸시 수신 동의는 유저가 설정한 푸시(adPush), 야간 수신(adNightPush) 동의 정보에 관계없이 항상 false로 처리됩니다.
GetUrl
인게임에서 사용하는 다양한 URL을 요청합니다
Copy static FString GetUrl(const FString& urlType, const FString& language = TEXT(""))
파라미터
urlType URL 종류, 종류는 아래 표를 참고하세요.
URL 종류
SDK에서 미리 정의한 상수를 사용하세요.
연령 정보 등록하지 않은 일본 계정으로 PC에서 결제 진행하는 경우
URLKey::TRANSACTION_HISTORY
GetVersion
플랫폼 SDK 버전을 조회합니다.
Copy static FString GetVersion();
리턴
버전 문자열. major.minor.patch
ex) 0.10.2
GetLastSigninTag
가장 최근 로그인한 정보를 조회합니다.
Copy static FString GetLastSigninTag()
리턴
Copy {
"maskedEmail" : "ma***@gmail.com",
"method" : "GOOGLE"
}
Copy void SetPlatformAuthAgent(HybePlatformAuthAgent* authAgent)
파라미터
리턴
Copy void SetPlatformWebviewAgent(HybePlatformWebviewAgent* webviewAgent)
파라미터
리턴
HybePlatformWebviewAgent을 상속받은 Agent 클래스를 등록합니다.
Copy void SetPlatformBillingAgent(class HybePlatform::HybeBillingAgent* billingAgent)
파라미터
billingAgent HybeBillingAgent 를 상속 받은 클래스 인스턴스
리턴
GetAuthAgent
Copy HybePlatformAuthAgent* GetAuthAgent() const
리턴
등록한 HybePlatformAuthAgent 인스턴스
GetWebviewAgent
Copy HybePlatformWebviewAgent* GetWebviewAgent() const
리턴
등록한 HybePlatformWebviewAgent 인스턴스
GetBillingAgent
등록한 HybeBillingAgent 인스턴스를 구합니다.
Copy HybePlatform::HybeBillingAgent* GetBillingAgent() const
리턴
등록한 HybeBillingAgent 인스턴스
ListenReturnToGame
외부 브라우저에서 전송하는 [게임으로 돌아가기] 이벤트를 수신하는 핸들러를 등록합니다.
Copy void ListenReturnToGame(TFunction<void(const FString&)> Callback)
파라미터
Callback 이벤트 수신 시 호출하는 콜백
CompleteReturnToGame
[게임으로 돌아가기] 이벤트를 수신 대기를 종료합니다.
Copy void CompleteReturnToGame()
파라미터
플랫폼 로그인 연동 과정에서 발생하는 이벤트를 수신하는 이벤트 리스너 Agent.
게임 클라이언트는 HybePlatformAuthAgent 를 상속받는 Agent를 반드시 구현해야한다.
OnLoginSuccess
Copy void OnLoginSuccess(const FString& resultJson)
파라미터
Copy {
"imid": "4M87F6H5GFFZDPY8QM97",
"loginToken": "xxx-xxx"
}
OnLoginFailure
Copy void OnLoginFailure(const FString& resultJson)
파라미터
Copy {
"message":"Login Cancel",
"code":2
}
에러 코드는 아래와 같이 정의되어 있습니다.
Copy enum class Code
{
UNKNOWN_ERROR = 0,
NO_INITIALIZE = 1,
SIGNIN_FAIL = 2, // Google/Apple Signin
PLATFORM_LOGIN_FAIL = 3, // Platform login
AUTO_LOGIN_FAIL = 4, // Auto login fail
WITHDRAW_ACCOUNT = 5, // 계정 탈퇴 회원 (deprecated)
SIGNUP_FAIL = 6, // 회원가입 실패
};
에러 코드별 전달되는 메시지는 다음과 같습니다.
Google/Apple/Line 등 3rd Party Signin 취소
NOT_SUPPORTED_SIGNIN_PROVIDER
OnLogoutSuccess
Copy void OnLogoutSuccess()
리턴 없음
OnLogoutFailure
Copy void OnLogoutFailure(const FString& message)
파라미터
OnMount
Copy void OnMount(bool mounted)
파라미터
Copy void UMyGamePlatformAuthAgent::OnMount(bool mounted)
{
if(mounted)
{
// 초기화 완료, 로그인, 자동 로그인 등을 구현한다
}
}
OnRefreshVerifyToken
Copy void OnRefreshVerifyToken(const FString& token)
파라미터
OnWithDraw
Copy void UStarterPlatformAuthAgent::OnWithDraw()
{
// 탈퇴된 계정은 Signout()으로 로그아웃할 수 없다.
HybePlatformAgent::Instance().ForceSignout();
}
OnInspection
인증 과정에서 발생하는 웹뷰 이벤트를 제공하는 클래스.
게임 클라이언트에서 상속한 클래스를 등록하면 웹뷰 이벤트가 등록된 Agent로 전달됩니다.
OnShowWebview
웹뷰 팝업 요청 이벤트 핸들러
Copy void OnShowWebview(const FString& url)
파라미터
회원 가입, 탈퇴, 본인 인증, 이메일 등록 등의 프로세스는 웹뷰를 통해 구현되어 있습니다. 요청한 프로세스 별로 필요한 단계에서 OnShowWebview 이벤트가 전달됩니다. 지정된 url로 웹뷰가 팝업되도록 구현해야 합니다.
OnCloseWebview
웹뷰 닫기 요청 이벤트 핸들러
Copy void OnCloseWebview()
파라미터 없음
회원 가입, 탈퇴 프로세스에서 웹뷰가 출력되고 해당 프로세스가 완료 또는 취소 되는 경우 호출됩니다. 화면에 출력된 웹뷰를 닫는 작업을 구현해야 합니다.
LogneticEvent
Set
속성을 추가합니다.
Copy template<typename T>
LogneticEvent& Set(const FString& key, T value)
파라미터
value 속성 값. int, usingined int, int64_t, uint64_64, float, double, FString 지원
리턴
AddObject
하위 로그 이벤트 객체를 생성합니다. 지정된 키(key)에 하위를 등록합니다.
Copy LogneticEvent& AddObject(const FString& key)
파라미터
리턴
Copy LogneticEvent().Set(TEXT("log_type"), TEXT("LOGOUT"))
.AddObject(TEXT("online_play"))
.Set(TEXT("play_cnts"), 5)
.ToJson();
JSON 생성 결과
Copy {
"log_type": "LOGOUT",
"cre_time": "2024-06-13T08:02:27.015000Z",
"online_play": {
"play_cnts": 5
}
}
체이닝(chaning) 형식으로 호출하는 경우 리턴 된 이벤트에 속성이 추가됩니다.
2번 호출하는 경우 새로 추가된 이벤트의 하위 속성으로 추가되기 때문에 주의가 필요합니다.
Copy LogneticEvent().Set(TEXT("log_type"), TEXT("LOGOUT"))
.AddObject(TEXT("online_play"))
.Set(TEXT("play_cnts"), 5)
.AddObject(TEXT("item_info")) //online_play 하위에 item_info가생성된다.
.Set(TEXT("type"), "bag")
.ToJson();
JSON 생성 결과
Copy {
"log_type": "LOGOUT",
"cre_time": "2024-06-13T08:02:27.015000Z",
"online_play": {
"play_cnts": 5,
"item_info": {
"type": "bag"
}
}
}
동일 경로의 하위 이벤트를 추가하는 경우
Copy LogneticEvent logoutLog;
logoutLog.Set(TEXT("log_type"), TEXT("LOGOUT"));
auto& onlinePlay = logoutLog.AddObject(TEXT("online_play"));
onlinePlay.Set(TEXT("play_cnts"), 5);
auto& itemInfo = logoutLog.AddObject(TEXT("item_info")); //루트에 생성된다.
itemInfo .Set(TEXT("type"), "bag");
logoutLog.ToJson();
JSON 생성 결과
Copy {
"log_type": "LOGOUT",
"cre_time": "2024-06-13T08:02:27.015000Z",
"online_play": {
"play_cnts": 5,
},
"item_info": {
"type": "bag"
}
}
AddArray
배열에 추가되는 로그 이벤트 객체를 생성합니다. 지정된 키(key)의 하위를 등록되며 지정된 키의 배열의 마지막 아이템으로 등록됩니다.
동일한 키(key) 로 호출할 때마다 배열에 새로운 이벤트 객체가 추가 됩니다.
Copy LogneticEvent& LogneticEvent::AddArray(const FString& key)
파라미터
리턴
배열 1개 이벤트 추가
Copy LogneticEvent log
log.Set(TEXT("log_type"), TEXT("LOGOUT"))
.AddArray(TEXT("play_details")) // online_play/play_details[0]
.Set(TEXT("dungeon_type"), TEXT("10"))
.Set(TEXT("scale"), 2);
log.ToJson().Send();
JSON 생성 결과
Copy {
"log_type": "LOGOUT",
"play_details": [
{
"dungeon_type": "10",
"dungeon_id": "1",
"scale": 2
}
]
}
}
동일한 키(key)로 호출할 때마다 배열에 새로운 이벤트 객체가 추가 됩니다.
배열 2개 이벤트 추가
Copy LogneticEvent log
log.Set(TEXT("log_type"), TEXT("LOGOUT"))
.AddArray(TEXT("play_details")) // online_play/play_details[0]
.Set(TEXT("dungeon_type"), TEXT("10"))
.Set(TEXT("scale"), 2);
log.AddArray(TEXT("play_details")) // online_play/play_details[1]
.Set(TEXT("dungeon_type"), TEXT("20"))
.Set(TEXT("scale"), 5);
log.ToJson().Send();
JSON 생성 결과
Copy {
"log_type": "LOGOUT",
"play_details": [
{
"dungeon_type": "10",
"scale": 2
},
{
"dungeon_type": "20",
"scale": 5
}
]
}
}
Send
로그를 서버에 전송합니다. 아래의 추가 작업을 수행합니다.
등록된 속성을 JSON으로 변환 후에 로그 서버에 전송합니다.
파라미터
LogneticAgent
JSON 로그를 서버에 전송하는 기능을 제공합니다.
SendEvent
JSON 로그를 서버에 전송합니다.
Copy void SendEvent(const FString& json)
void SendEvent(TArray<FString> jsons)
파라미터
Copy FString myLog = BuildCustomLog();
LogneticAgent::Instance().SendEvent(myLog); // 동일 Lognetic().SendEvent(myLog);
1개 이상의 로그 전송이 필요한 경우.
로그 전송은 요청 시 마다 개별로 서버에 전송합니다.
여러 개의 로그를 한꺼번에 요청하는 것이 효과적입니다.
1개 이상 로그 전송하기
Copy FString myLog = BuildCustomLog();
FString myLog2 = BuildCustomLog2();
FArray logs = {myLog, myLog2};
LogneticAgent::Instance().SendEvent(logs); // 동일 Lognetic().SendEvent(logs);
SetCommon
공통 속성을 설정합니다.
Copy template<typename T>
typename std::enable_if<is_allowed_log_type<T>::value, void>::type //허용된 타입 제한
SetCommon(const FString& key, T value)
파라미터
Copy LogneticAgent::Instance().SetCommon(TEXT("os_type"), 1);
LogneticAgent::Instance().SetCommon(TEXT("service_id"), TEXT("10060000"));
LogneticAgent::Instance().SetCommon(TEXT("external_device_type"), 0);
LogneticAgent::Instance().SetCommon(TEXT("external_device_id"), FPlatformMisc::GetLoginId());
Lognetic
Copy #define Lognetic() LogneticAgent::Instance()
Troubleshooting
플러그인 초기화 실패가 발생합니다.
해결
steam_api64.dll 파일이 실행 폴더에 위치하는지 확인합니다
안드로이드 구글 로그인이 실패합니다.
로그인 할 계정을 선택하면 Login cancel 실패 이벤트가 수신 됩니다.
해결
앱 사이닝 적용 후 다시 빌드하세요.
또는초기화 설정 정보에 WebClientId가 현재 접속 환경에 등록된 값인지 확인하세요.
Copy "WebClientId": "xxx-xxxx-xxx"
함께 볼만한 문서