使用Steamwork.Net 接入Steam一点心得
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一点心得的更多相关文章
- 谈谈选用技术的原则,技术学习方法技巧,阅读代码的技巧及其它 MSF的一点心得
谈谈技术原则,技术学习方法,代码阅读及其它(正文) 这篇文章是前一阵在水木BBS上和别人讨论中偶自己发言的摘编,是偶这几年开发过程完全经验式的总结.完全个人经验,供批判. 一.选用技术的原则 比较规范 ...
- WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信
原文:WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信 最近工作需要,学习了一下winform内嵌webbrowser控件,然后与htm页面中的javasc ...
- 使用Webbrowser的一点心得体会
原文:使用Webbrowser的一点心得体会 自从用上VS2005后,发现多了个WebBrowser控件(.net 2003中不带),为图方便吧,有好多小工具就用这个写的,慢慢也有点体会了,总结一下, ...
- Unity游戏接入Steam成就
在接入Steam成就,其实有些地方是有坑点的,而且steam官网给的是c++代码的接入教程.如果是老鸟的话,接入还并不是很难. 但是对于新手其实还是比较痛苦的,网上这方面的资料很少.这里我给总结下,u ...
- 【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)
原文:基于NVIDIA显卡的硬编解码的一点心得 (完结) 1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器 ...
- 关于使用Exception的一点心得
毫无疑问,Exception有很多优点.查看任何一本面向对象的书籍,都会提到异常相对于返回值标记状态的不足以及避免错误导致程序崩溃的问题.看起来是很好的,用起来也是很好的.可是这么多年过去了,异常用的 ...
- SVM一点心得体会
支持向量机的学习说是刚刚开始,又不合理,只能说隔了很长的时间再看,终于在分类这块的层面上有了新的认识. 总的来说,支持向量机分为线性支持向量机和非线性支持向量机,线性支持向量机又可以分为硬间隔最大化线 ...
- 记录自己对EventLoop和性能问题处理的一点心得
1.EventLoop 这里说的EventLoop不是指某一个具体的库或是框架,而是指一种程序实现结构.这种结构多是基于IO多路转接的API(select.poll.epoll之类)以reactor模 ...
- 从Eclipse转移到IntelliJ IDEA一点心得
http://www.ituring.com.cn/article/37792 本人使用IntelliJ IDEA其实并不太久,用了这段时间以后,觉得的确很是好用.刚刚从Eclipse转过来的很多人开 ...
随机推荐
- UiPath文本操作Get Text的介绍和使用
一.Get Text操作的介绍 从指定的UI元素提取文本值 二.Get Text在UiPath中的使用 1. 打开设计器,在设计库中新建一个Sequence,为序列命名及设置Sequence存放的路径 ...
- 用python制作文件搜索工具,深挖电脑里的【学习大全】
咳咳~懂得都懂啊 点击此处找管理员小姐姐领取正经资料~ 开发环境 解释器: Python 3.8.8 | Anaconda, Inc. 编辑器: pycharm 专业版 先演示效果 开始代码,先导入模 ...
- DNS 系列(一):为什么更新了 DNS 记录不生效?
我们在上网时如果想要访问到另一台机器上的内容,通常只需要直接输入一串地址,例如:www.upyun.com,就能够准确访问到自己想要访问的网站.但是实际上这只是方便我们记忆的字符形式网络标识,真正让我 ...
- 基于YCbCr色彩模型的简易肤色识别器
一.实验方法 实验共选取了12张图像,利用画笔工具在每幅图像上选取5个点,并分别记录RGB值.取点方式如下图所示: 总共70个点,R,G,B的值分别如下表所示: RGB色彩模型和YCbC ...
- 挑战30天写操作系统-day2-汇编语言学习与Makefile入门
1.介绍文本编辑器 这里,我们直接采用自己windows电脑自带的文本编辑器即可以完成制作要求 2.继续开发 下面先是对昨天使用的helloos.nas文件内容进行详细解释 ; hello-os ; ...
- Junit使用步骤和junit_@Before&@After
测试: 1.定义一个测试类(测试用例) 建议: 测试类名:被测试的类型Test CalculatorTest 包名:xxx.xxx.xx.test com.li.Test 2.定义测试方法:可以独立运 ...
- 关于canvas的图片获取及python处理
获取canvas图片的对应base64的uri(echart图.v-chart图 canvas元素.toDataURL()获取对应canvas的base64 uri的链接 前端处理生成的uri,可以生 ...
- vscode无法调试python2.7版本
概述 好久没有用python2.7版本了,最近有个老的脚本要优化,但是发现vscode无法对脚本调试,特此记录下解决方法. 本地安装有python2和python3,开发过程中,vscode可以随时调 ...
- js for和while两种99乘法表
<script type="text/javascript"> for(var i=1; i<=9; i++) { for(var j=1; j<=i;j+ ...
- Python算法之动态规划(Dynamic Programming)解析:二维矩阵中的醉汉(魔改版leetcode出界的路径数)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_168 现在很多互联网企业学聪明了,知道应聘者有目的性的刷Leetcode原题,用来应付算法题面试,所以开始对这些题进行" ...