# PC SDK Unreal示例
为了解如何在基于UNREAL的游戏中应用STOVE PC SDK 2.0,在HelloStove项目中对接STOVE PC SDK,并说明使用SDK API的方法。
在进行示例例题之前,应事先设置STOVE客户端 (opens new window),并参考SDK开发环境准备,提前发放Appkey、Appsecret、Game Id。
HelloStove项目由Visual Studio 2015 Update 3
制作。
HelloStove项目的Unreal StoveSDK插件
只支持UNREAL引擎4.21-2
以上,需要事先安装Epic Games Launcher
和UNREAL编辑器
。
# 下载示例用HelloStove项目
下载以下链接的 HelloStove项目并解压缩 。
HelloStove项目为UNREAL StoveSDK 插件
未绑定状态。下面进行UNREAL StoveSDK 插件
对接示例。
# 构建工程环境
- 从STOVEPC SDK 下载页面 下载最新版本的
Unreal(C/C++)
分发文件(以下简称为Plugin
)。
蓝图(UNREAL Blint)目前尚未正式提供,但必要时请通过store.support@smilegate.com获得技术支持。
# 1) 配置 UNREALPlugin文件夹
在HelloStove项目 StovePCSDK_UNREAL文件夹中,将 STOVE PC SDK StovePCSDK_UNREAL_x.x.zip
文件解压缩后的Plugins
文件夹复制到HelloStove项目中,如下图所示,完成可打包HelloStove_Unreal
的状态。
双击HelloStove.uproject
时,会出现是否要进行UNREAL Rebuild的选择窗口(根据UNREAL版本,可能会先显示引擎版本选择窗口),在此选择是
(Y)时,在相应文件夹中生成Binaries、Intermediate、Saved等附加文件夹。 生成附带文件夹后,最终的结果是UNREAL编辑器自动运行。
# 2) 创建 VisualStudio 解决方案
UNREAL Build正常完成时,利用UNREAL编辑器生成HelloStove.sln
。 右键单击HelloStove.uproject
可创建Visual Studio解决方案。
根据UNREAL版本先生成
HelloStove.sln
文件。
# 3) 在Visual Studio解决方案中配置StovePCSDK Plugin
如果已完成Visual Studio解决方案文件创建,HelloStove项目需要下一步操作来绑定Plugin
。
# a. 组成StoveSDK_Unreal
构建模块
为了在HelloStove项目 (HelloStove_Unreal
文件夹中识别Plugin模块, 在 HelloStove.uproject
和 HelloStove.Build.cs
文件中添加模块名称的依附性。
双击HelloStove.sln
文件以运行 Visual Studio,并在解决方案浏览器中打开HelloStove.uproject
文件,将Plugin的名称StoveSDKPlugin
添加到Additional Dependencies
项目中,如下代码所示:
HelloStove.uproject
{
"FileVersion": 3,
"EngineAssociation": "4.21",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "HelloStove",
"Type": "Runtime",
"LoadingPhase": "Default",
"AdditionalDependencies": [
"UMG",
"Engine",
"CoreUObject",
"StoveSDKPlugin"
]
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HelloStove.Build.cs为了将Plugin嵌入UNREAL引擎,将StoveSDK Plugin
分别添加到以下代码Public Dependency Module Names
和Private Dependency Module Names
模块中。
HelloStove.Build.cs
using UnrealBuildTool;
public class HelloStove : ModuleRules
{
public HelloStove(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Projects", "StoveSDKPlugin" });
PrivateDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Projects", "StoveSDKPlugin" });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# b. 更改
UMyStoveSDKObject
的父Class
如果通过上述步骤添加了Plugin的构建模块的从属性,为了使用STOVE SDK函数,将衍生级别UMyStoveSDKObject
的父级别(parent class)从现有的UStoveSDKEmptyObject
级别更改为新的UStoveSDKObect
级别。
在更改父级之前,UMyStoveSDKObject
类继承了虚设代码UStoveSDKEmptyObject
, 但它不运行任何功能 。 为了使用Plugin的全部功能, 您必须包含头文件 StoveSDKObject.h
并更改为重新继承 UStoveSDKObect
类 。
Before
#pragma once
#include "CoreMinimal.h"
#include "StoveSDKEmptyObject.h"
#include "MyStoveSDKObject.generated.h"
DECLARE_DELEGATE_OneParam(FDele_Delegate_Log, FString);
UCLASS()
class HELLOSTOVE_API UMyStoveSDKObject : public UStoveSDKEmptyObject
{
GENERATED_BODY()
protected:
// // Called when the game starts or when spawned
...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
After
#pragma once
#include "CoreMinimal.h"
#include "StoveSDKObject.h"
#include "MyStoveSDKObject.generated.h"
DECLARE_DELEGATE_OneParam(FDele_Delegate_Log, FString);
UCLASS()
class HELLOSTOVE_API UMyStoveSDKObject : public UStoveSDKObject
{
GENERATED_BODY()
protected:
// // Called when the game starts or when spawned
...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
完成父级更改后,只需从项目中删除 StoveSDKEmptyObect.h
或注释处理信头,会顺利进行打包。
# c. 在
UMyGameInstance
中创建UMyStoveSDKObect
成员变量
清除HelloStove中UMyGameInstance相关 /*remark delete */
代码中的注释。
- UMyGameInstance.h
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
/*remark delete*/
/*#include "MyStoveSDKObject.h"*/
#include "MyGameInstance.generated.h"
UCLASS()
class HELLOSTOVE_API UMyGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
UMyGameInstance()
{
/*remark delete*/
/*_stoveSDKObject = NewObject<UMyStoveSDKObject>();*/
}
private:
/*remark delete*/
/*UPROPERTY()
UMyStoveSDKObject* _stoveSDKObject;*/
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# d. 连接
MyUserWidget
的按钮事件
HelloStove项目提供用于测试Plugin API(STOVE SDK)的按钮。 为连接Plugin和按钮事件,清除UMy HelloStoveWidget
类中的 /*remark delete*/
标记相关代码注释。
UMyHelloStoveWidget.cpp
/*remark delete*/
/*auto stoveSDKObject = Cast<UMyStoveSDKObject>(FindStoveSDKObject());
stoveSDKObject->_OnDeleLog.BindUObject(this, &UMyHelloStoveWidget::OnEventLog);*/
void UMyHelloStoveWidget::OnClickInit()
{
/*remark delete*/
/*auto stoveSDKObject = Cast<UMyStoveSDKObject>(FindStoveSDKObject());
stoveSDKObject->StoveSDKInit(FStoveConfig{});*/
}
void UMyHelloStoveWidget::OnClickToken()
{
/*remark delete*/
/*auto stoveSDKObject = Cast<UMyStoveSDKObject>(FindStoveSDKObject());
stoveSDKObject->StoveSDKGetToken();*/
}
void UMyHelloStoveWidget::OnClickUser()
{
/*remark delete*/
/*auto stoveSDKObject = Cast<UMyStoveSDKObject>(FindStoveSDKObject());
stoveSDKObject->StoveSDKGetUser();*/
}
void UMyHelloStoveWidget::OnClickUnInit()
{
/*remark delete*/
/*auto stoveSDKObject = Cast<UMyStoveSDKObject>(FindStoveSDKObject());
stoveSDKObject->StoveSDKUnInit();*/
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 初始化 Plugin
要初始化 Plugin,请在 FStovePCConfig
结构体中设置 Plugin( STOVE PC SDK) 环境值, 并将以下示例代码输入到 UMyStoveSDKObject::StoveSDKInit
函数里。
MyStoveSDKObject.cpp
FStoveResult UMyStoveSDKObject::StoveSDKInit(const FStoveConfig& Config)
{
/*여기에 '따라하기' 코드를 추가합니다.*/
/*이 함수에서 함수인자로 받은 fConfig는 무시합니다. */
//config
FStoveConfig ReplaceConfig{
"LIVE",
"YOUR_APP_KEY",
"YOUR_SECRET_KEY",
"YOUR_GAME_ID",
STOVE_PC_LOG_LEVEL_DEBUG,
"" }; // logpath
FStoveResult ErrorResult = Super::StoveSDKInit(ReplaceConfig);
if (ErrorResult.Result == STOVE_PC_NO_ERROR)
{
OnLog("[Success] StovePC_Init");
}
else
{
OnLog("[Error] StovePC_Init, Result %d", ErrorResult.Result);
}
return ErrorResult;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
注意事项
PCSDK日志路径必须设置为绝对路径。 ex) C:\Program Files\{您的游戏文件夹}\Logs
不要在末尾添加“\”。 PCSDK自动添加文件名“StovePCSDK.log”。
如果将路径设置为空字符串“”,则PCSDK会自动在游戏可执行文件夹或PCSDK DLL所在文件夹的路径中创建日志。
上述代码的YOUR_APP_KEY,YOUR_SECRET_KEY,YOUR_GAME_ID必须更改为STOVE Studio (opens new window)) 预先注册的ID和Key值。 如果不用入驻STOVE Studio的stove 帐户
登录STOVE客户端,调用Super:: StoveSDKInit
函数, 则会出现 150 错误代码(sgup 初始化失败)。
UMyStoveSDKObject::StoveSDKInit
函数的返回值为STOVE_PC_NO_ERROR
,即成功
,则输入UMyStoveSDKObject
的超级级(Super class) USToveSDKObject:::StoveSDKInit
函数中的_isOnCallback
值输入true
, 将UStoveSDKObject::Tick
当做定时器使用。
为了确定UMyStoveSDKObject::StoveSDKInit
函数是否正常完成, 在UMyStoveSDKObject:::OnInitComplete
函数中添加以下OnLog
。
MyStoveSDKObject.cpp
void UMyStoveSDKObject::OnInitComplete()
{
/*在此添加`示例`代码。*/
OnLog("[Success] InitComplete");
}
2
3
4
5
6
7
如果调用StoveSDKObject::StoveSDKInit
函数或其他Plugin函数失败,则可以通过调用UMyStoveSDKObject:::OnError
函数检查错误代码。 为了检查错误代码,如下所示,可通过UMyStoveSDKObject:: OnError
函数参数相关FStoveError
结构获得错误信息。
MyStoveSDKObject.cpp
void UMyStoveSDKObject::OnError(FStoveError Error)
{
/*在此添加`示例`代码。*/
OnLog("[Error]");
OnLog("FuncType: %d", Error.FunctionType);
OnLog("Result: %d", Error.ErrorResult.Result);
OnLog("ExternalError: %d", Error.ExternalError);
}
2
3
4
5
6
7
8
9
# Plugin退出
Plugin全部使用结束后,为了整理资源,您可以使用以下代码在UMyStoveSDKObject::StoveSDKUnInit
函数中调用超级Class的Super:::StoveSDKUnInit
函数来解除Plugin资源。
MyStoveSDKObject.cpp
FStoveResult UMyStoveSDKObject::StoveSDKUnInit()
{
/*在此添加`示例`代码。*/
//SDK 退出
FStoveResult ErrorResult = Super::StoveSDKUnInit();
if (ErrorResult.Result == STOVE_PC_NO_ERROR)
{
OnLog("[Success] StovePC_UnInit");
}
else
{
OnLog("[Error] StovePC_UnInit, Result %d", ErrorResult.Result);
}
return ErrorResult;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 获取用户信息
为了获取登录到STOVE客户端的用户信息, 以下调用代码UMyStoveSDKObject::StoveSDKGetUser
函数通过调用超级级别的Super:: StoveSDKGetUser
函数来请求用户信息。调用Super:: StoveSDKGetUser
函数时,将用户信息传递到回传OnUser函数 。
MyStoveSDKObject.cpp
FStoveResult UMyStoveSDKObject::StoveSDKGetUser()
{
/*在此添加`示例`代码。*/
FStoveResult ErrorResult = Super::StoveSDKGetUser();
if (ErrorResult.Result == STOVE_PC_NO_ERROR)
{
OnLog("[Success] StovePC_GetUser");
}
else
{
OnLog("[Error] StovePC_GetUser, ErrorResult %d", ErrorResult.Result);
}
return ErrorResult;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
正常调用UMyStoveSDKObject::StoveSDKGetUser
函数时,通过返回 OnUser 的参数FStoveUser
结构获取用户信息。 用户信息获取方法可通过以下代码进行确认。
MyStoveSDKObject.cpp
void UMyStoveSDKObject::OnUser(FStoveUser fUser)
{
/*在此添加`示例`代码。*/
OnLog("[User]");
OnLog("MemberNo : %u", User.MemberNo);
OnLog("Nickname : %s", *(User.Nickname));
OnLog("GameUserId: %s", *(User.GameUserId));
}
2
3
4
5
6
7
8
9
10
# 获取令牌信息
为了获取STOVE客户端用户的令牌信息, 通过在UMyStoveSDKObject ::StoveSDKGetToken
函数中调用超级级别的Super:::StoveSDKGetToken
函数来获取。 在调用StoveSDKGetToken
函数后, 您可以通过调用返回OnToken
函数的参数来查看令牌信息 。
MyStoveSDKObject.cpp
FStoveResult UMyStoveSDKObject::StoveSDKGetToken()
{
/*在此添加`示例`代码。*/
FStoveResult ErrorResult = Super::StoveSDKGetToken();
if (ErrorResult.Result == StovePCResult::STOVE_PC_NO_ERROR)
{
OnLog("[Success] StovePC_GetToken");
}
else
{
OnLog("[Error] StovePC_GetToken, Result %d", ErrorResult.Result);
}
return ErrorResult;
} return fResult;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
令牌是什么? 登录STOVE客户端的用户会生成Access Token,游戏服务器可以将该Access Token传达给Stove认证服务器,进行登录用户的有效性验证。 关于Access Token的详细说明,请通过咨询Stove Indie Team (opens new window)获得技术支援。
如果正常调用StoveSDKGetToken
函数, 则可以通过OnToken
函数参数FStoveToken
查看令牌信息。
MyStoveSDKObject.cpp
void UMyStoveSDKObject::OnToken(FStoveToken Token)
{
/*在此添加`示例`代码。*/
OnLog("[Token]");
OnLog("Token : %s", *(Token.AccessToken));
}
2
3
4
5
6
7
8
# 构建和运行
HelloStove 项目在build
后执行。 运行 UNREAL 编辑器后,按工具栏上的Play
按钮运行样本,并根据顺序按屏幕上的每个按钮,确认是否正常工作。
恭喜! 您已成功完成了PC SDK Unreal示例。