使用Steamwork.Net 接入Steam一点心得

2022-10-29,,,

1.  前言

这是我在开发过程中使用的一点总结,目前使用的东西包含基础登录功能,存档功能,成就系统,以及DLC安装功能。Steamwork不仅仅有这些功能还有游戏内交易,排行榜,数据传输等功能,这些功能我并未亲身体验过于是不包含在本文档当中。文章详细使用在《Steamwork.Net使用》这里不想看前面可以直接跳过

2.  版本

我使用的版本为Steamworks.NET_15.0.1请大家注意版本不同

3.  Steamwork.Net 官方下载地址

https://github.com/rlabrecque/Steamworks.NET/releases/

4.  前期准备

4.1 建立游戏

首先您需要在Steam平台建立您自己的游戏(在Steam建立游戏需要花钱),并获得相关游戏ID,就像我图中的这样:

其中1274360就是我做的游戏ID,下面是我的游戏DLC编号(这个在DLC使用篇会有用到)。

4.2  建立成就

如图所示,API名称是程序在内部调用的,剩下的显示成就名称与描述,可以根据不同语言进行调整。

5. Steamwork.Net使用

5.1 建立文件

Steamwork.Net 需要在游戏运行目录下/Unity Asset目录下建立steam_appid.txt文件并在文件中写入游戏ID(对就是在建立游戏那里的ID).

5.2 使用前检查

检测建立的结构体空间是否能够正常使用

返回值Bool

Packsize.Test();

检测依赖DLL是否存在 返回值Bool

DllCheck.Test();

如果检测返回false建议不要继续下去,可能游戏被篡改了,或者文件丢失

5.3 建立SteamManager空物体

并设置该物体为不销毁,原因如下:下方为SteamWorkAPI官方代码

系统将会根据物体的存在自动进行关闭SteamAPI连接

并且 在Update时会自动调用RunCallBacks(这是异步操作响应的关键)当然你可以用自己的方法进行控制;

可让物品不销毁的函数(Unity)

DontDestroyOnLoad(apiObj);

5.4 开始使用(初始化)

参数说明:传入类型(AppId_t) 传入内容Int64 (ID是游戏的ID)

返回值:bool

功能:传入游戏的ID (在Init之前传入)

SteamAPI.RestartAppIfNecessary((AppId_t)ID);

参数说明:Void

返回值:bool

功能:初始化SteamAPI(必须初始化才可以调用具体功能的API)

SteamAPI.Init()

5.5 功能展示

需要在SteamAPI初始化完成后才能进行下面的操作

5.5.1 获取用户唯一标识

参数说明:Void

返回值:CSteamID(用户唯一ID)可转换为Int64/String

功能:获取用户ID

SteamUser.GetSteamID();

5.5.2 成就/统计相关操作

参数说明:成就名称(传入设置的成就名称)

返回值:bool

功能:清除所有已经获得的成就(该操作作为研发测试使用,亲测使用时速度很快,使用内存中的数据)

SteamUserStats.ClearAchievement(string Name);

参数说明: 成就名称(传入设置的成就名称)

返回值:bool

功能:设置成就已经获得(使用内存中的数据,亲测使用时速度很快)

SteamUserStats.SetAchievement(chengjiuName);

参数说明: 成就名称(传入设置的成就名称) ,是否获得成就(输出参数)

返回值:bool 仅为是否调用成功

功能:设置成就已经获得(使用内存中的数据,亲测使用时速度很快)

SteamUserStats.GetAchievement(chengjiu, out res);

参数说明:统计名称,统计数据

返回值:bool

功能: 设置统计数据,操作为内存中的数据

SteamUserStats.SetStat(string name,int/float data)

参数说明:统计名称,统计数据(输出参数)

返回值:bool

功能:获得当前的统计数据

SteamUserStats.GetStat(chengjiuName, out data);

参数说明:Void

返回值:bool

功能:将本地成就,统计同步到服务器(速度根据网络实际情况决定,不是很快,Steam在游戏关了有自动同步,但是有失败的概率, Steam显示成就达成的UI在成就同步完成后显示,建议定时调用)

SteamUserStats.StoreStats();

5.5.3 云存档相关操作

5.5.3.1 特别说明

由于众所周知的原因Steam 云存档传入传出速度并不快,如果使用同步方法,很容易造成卡死,于是这里我使用异步方法(异步方法复杂程度较大)并且提供示例代码

5.5.3.2  方法说明

参数说明:Void

返回值:bool

功能:检测当前玩家设置(云存档是否启用)

SteamRemoteStorage.IsCloudEnabledForApp()

5.5.3.2.1 写入服务器文件一系列函数/类

参数说明:服务器文件名称,文件数据,文件长度

返回值:SteamAPICall_t(一个指针ID,用于匹配异步返回的操作)

功能:异步写入服务器文件 如果有原始文件则覆盖,没有就创建

SteamRemoteStorage.FileWriteAsync(string FileName, byte[] Data,uint Length);

这是一个特有的类似委托的类 用于接受并触发 当文件读取完成 回调函数的操作(下方会讲解如何使用)

CallResult<RemoteStorageFileWriteAsyncComplete_t>;

5.5.3.2.1.1 写入相关操作流程

1. 首先调用异步写入文件(如果要求不严谨这里其实就完了) 得到标记指针

Var call=SteamRemoteStorage.FileWriteAsync(ContentDocument.FileName, Data, (uint)Data.Length);

2. 创建回调对象,设置回调函数 红色部分

var OnRemoteStorageFileWriteAsyncCompleteCallResult = CallResult<RemoteStorageFileWriteAsyncComplete_t>.Create(OnRemoteStorageFileWriteAsyncComplete);

//重点设置call指针 否则永远不会被回调

OnRemoteStorageFileWriteAsyncCompleteCallResult.Set(call);

3. 等待回调

4.回调函数内部

void OnRemoteStorageFileWriteAsyncComplete(RemoteStorageFileWriteAsyncComplete_t pCallback, bool bIOFailure)

{

//根据EResult 判断是否传递成功

var res= pCallback.m_eResult;

}

5.5.3.2.2 取得服务器文件一系列函数/类

参数说明:服务器文件名称

返回值:Int32(服务器文件大小)

功能:获得服务器文件大小

SteamRemoteStorage.GetFileSize(string FileName);

参数说明:服务器文件名称,文件开始,文件大小

返回值:SteamAPICall_t(一个指针ID,用于匹配异步返回的操作)

功能:获得服务器文件(异步),该操作点击执行后,会在后台下载该文件,不会导致主线程卡顿,需要通过其他函数查看下载情况

SteamRemoteStorage.FileReadAsync(string FileName, uint start, uint size);

这是一个特有的类似委托的类 用于接受并触发 当文件读取完成 回调函数的操作(下方会讲解如何使用)

CallResult<RemoteStorageFileReadAsyncComplete_t>

参数说明:传入标记指针,文件本身数据,文件大小

返回值:bool(是否调用成功)

功能:获得服务器文件本身

SteamRemoteStorage.FileReadAsyncComplete (SteamAPICall_t hReadCall, byte[] pvBuffer, uint cubToRead);

5.5.3.2.2.1 取得服务器文件操作

1.第一步 获取服务器文件长度

SteamRemoteStorage.GetFileSize(文件名称);

2. 调用服务器异步读取函数 我这里演示的获取这个文件全部内容,如果你喜欢分段获取也可以,此时调用完成你获得了 一个SteamAPICall_t 指针标记

SteamRemoteStorage.FileReadAsync(ContentDocument.FileName, 0, (uint)size);

3. 创建回调类,我标记红色的是传入的回调函数

var OnRemoteStorageFileReadAsyncCompleteCallResult =CallResult<RemoteStorageFileReadAsyncComplete_t>.

Create(OnRemoteStorageFileReadAsyncComplete);

重点在这里,设置之前获得的SteamAPICall_t 指针标记,才能成功回调

OnRemoteStorageFileReadAsyncCompleteCallResult.Set(rescall);

下面是函数头部

void OnRemoteStorageFileReadAsyncComplete(RemoteStorageFileReadAsyncComplete_t pCallback, bool bIOFailure);

4.等待服务器回调,回调完成后根据是否成功取得文件

void OnRemoteStorageFileReadAsyncComplete(RemoteStorageFileReadAsyncComplete_t pCallback, bool bIOFailure)

{

if (pCallback.m_eResult == EResult.k_EResultOK)

{

byte[] Data = new byte[pCallback.m_cubRead];

//说明可以读取文件

SteamRemoteStorage.FileReadAsyncComplete(pCallback.m_hFileReadAsync, Data, pCallback.m_cubRead);

}

}

5.5.4 获取DLC购买情况

参数说明:传入DLC ID 可以由Uint 转入

返回值:bool(是否调用成功)

功能:获得DLC是否正确安装

SteamApps.BIsDlcInstalled(appId_T);

使用Steamwork.Net 接入Steam一点心得的相关教程结束。

《使用Steamwork.Net 接入Steam一点心得.doc》

下载本文的Word格式文档,以方便收藏与打印。