# PC SDK Unreal示例

为了解如何在基于UNREAL的游戏中应用STOVE PC SDK 2.0,在HelloStove项目中对接STOVE PC SDK,并说明使用SDK API的方法。

confirm 在进行示例例题之前,应事先设置STOVE客户端 (opens new window),并参考SDK开发环境准备,提前发放Appkey、Appsecret、Game Id。
HelloStove项目由Visual Studio 2015 Update 3 制作。
HelloStove项目的Unreal StoveSDK插件只支持UNREAL引擎4.21-2以上,需要事先安装Epic Games LauncherUNREAL编辑器

# 下载示例用HelloStove项目

下载以下链接的 HelloStove项目并解压缩 。

HelloStove项目为UNREAL StoveSDK 插件未绑定状态。下面进行UNREAL StoveSDK 插件对接示例。

# 构建工程环境

confirm 蓝图(UNREAL Blint)目前尚未正式提供,但必要时请通过store.support@smilegate.com获得技术支持。

# 1) 配置 UNREALPlugin文件夹

在HelloStove项目 StovePCSDK_UNREAL文件夹中,将 STOVE PC SDK StovePCSDK_UNREAL_x.x.zip文件解压缩后的Plugins文件夹复制到HelloStove项目中,如下图所示,完成可打包HelloStove_Unreal的状态。

Figure1

双击HelloStove.uproject时,会出现是否要进行UNREAL Rebuild的选择窗口(根据UNREAL版本,可能会先显示引擎版本选择窗口),在此选择(Y)时,在相应文件夹中生成Binaries、Intermediate、Saved等附加文件夹。 生成附带文件夹后,最终的结果是UNREAL编辑器自动运行。

Figure6

Figure6.2

Figure6.3

# 2) 创建 VisualStudio 解决方案

UNREAL Build正常完成时,利用UNREAL编辑器生成HelloStove.sln。 右键单击HelloStove.uproject可创建Visual Studio解决方案。

confirm 根据UNREAL版本先生成HelloStove.sln文件。

Figure2

# 3) 在Visual Studio解决方案中配置StovePCSDK Plugin

如果已完成Visual Studio解决方案文件创建,HelloStove项目需要下一步操作来绑定Plugin

# a. 组成StoveSDK_Unreal 构建模块

为了在HelloStove项目 (HelloStove_Unreal文件夹中识别Plugin模块, 在 HelloStove.uprojectHelloStove.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"
			]
		}
	]
}
1
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 NamesPrivate 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
	}
}
1
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
   ...
1
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
    
    ...
1
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;*/
};

1
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();*/
}

1
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;
}
1
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所在文件夹的路径中创建日志。

confirm 上述代码的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");
}

1
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);
}
1
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;
}
1
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;
}
1
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));

}
1
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;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

confirm 令牌是什么? 登录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));
}

1
2
3
4
5
6
7
8

# 构建和运行

HelloStove 项目在build后执行。 运行 UNREAL 编辑器后,按工具栏上的Play 按钮运行样本,并根据顺序按屏幕上的每个按钮,确认是否正常工作。

Figure5

恭喜! 您已成功完成了PC SDK Unreal示例。

Last Updated: 2023/11/22 13:25:27