独立开发者在对接STEAM SDK之前 首先得先登上青睐之光,也就是我们俗称的“绿光”

一般要先对接G胖家的SDK,然后提交版本,最后等待审核。。。

我本身是unity 开发,对C++也是糊里糊涂..所以这里主要围绕unity说下我对接SDK的一些经历

sdk地址:http://steamworks.github.io/installation/

c#接口介绍地址:http://steamworks.github.io/gettingstarted/

steamwork使用教程视频:https://www.youtube.com/playlist?list=PLckFgM6dUP2jBeskIPG-7BVJR-I0vcSGJ

-----------------------------------------------------------------------------------------------------

第一步:

安装 Steamwork.NET(这里要感谢外国小哥)

1.下载 .unitypackage Stable (7.0.0) 或者从 Github 克隆

2.导入下载的所有文件到项目 Assets/ 目录下.

3.打开unity项目,会自动生成steam_appid.txt到项目的主目录下.

4.打开 steam_appid.txt 并将 480 修改为自己的 AppId.

5.更改脚本 SteamManager.cs 找到  SteamAPI.RestartAppIfNecessary(AppId_t.Invalid)将AppId_t.Invalid替换成(AppId_t)480" 或者 "new AppId_t(480),480改成自己的APP ID如图:

  1. if (SteamAPI.RestartAppIfNecessary(new AppId_t(55220))) {
  2. Application.Quit();
  3. return;
  4. }

6.Steam根据提示修改重启unity,保证 steam_appid.txt 已生效.

7.重启unity,保证 steam_appid.txt 已生效.

8.安装sdk完成.

 
 

如何使用

1.下载SteamManagers.cs

2.将SteamManager.cs脚本挂在GameObject上,steam会自动生成单例

3.完整C#接口请点击查看

 

注:需要在https://partner.steamgames.com/home下载sdk,里面有提交游戏的工具,在\sdk\tools\ContentBuilder\builder
        在https://partner.steamgames.com/home/steamworks可以查看文档
        在http://steamworks.github.io/gettingstarted/可以查看C#接口的使用方式

 
完整SteamManager:
  1. // The SteamManager is designed to work with Steamworks.NET
  2. // This file is released into the public domain.
  3. // Where that dedication is not recognized you are granted a perpetual,
  4. // irrevokable license to copy and modify this files as you see fit.
  5. //
  6. // Version: 1.0.5
  7. using UnityEngine;
  8. using System.Collections;
  9. using Steamworks;
  10. //
  11. // The SteamManager provides a base implementation of Steamworks.NET on which you can build upon.
  12. // It handles the basics of starting up and shutting down the SteamAPI for use.
  13. //
  14. [DisallowMultipleComponent]
  15. public class SteamManager : MonoBehaviour {
  16. private static SteamManager s_instance;
  17. private static SteamManager Instance {
  18. get {
  19. if (s_instance == null) {
  20. return new GameObject("SteamManager").AddComponent<SteamManager>();
  21. }
  22. else {
  23. return s_instance;
  24. }
  25. }
  26. }
  27. private static bool s_EverInialized;
  28. private bool m_bInitialized;
  29. public static bool Initialized {
  30. get {
  31. return Instance.m_bInitialized;
  32. }
  33. }
  34. private SteamAPIWarningMessageHook_t m_SteamAPIWarningMessageHook;
  35. private static void SteamAPIDebugTextHook(int nSeverity, System.Text.StringBuilder pchDebugText) {
  36. Debug.LogWarning(pchDebugText);
  37. }
  38. private void Awake() {
  39. // Only one instance of SteamManager at a time!
  40. if (s_instance != null) {
  41. Destroy(gameObject);
  42. return;
  43. }
  44. s_instance = this;
  45. if(s_EverInialized) {
  46. // This is almost always an error.
  47. // The most common case where this happens is when SteamManager gets destroyed because of Application.Quit(),
  48. // and then some Steamworks code in some other OnDestroy gets called afterwards, creating a new SteamManager.
  49. // You should never call Steamworks functions in OnDestroy, always prefer OnDisable if possible.
  50. throw new System.Exception("Tried to Initialize the SteamAPI twice in one session!");
  51. }
  52. // We want our SteamManager Instance to persist across scenes.
  53. DontDestroyOnLoad(gameObject);
  54. if (!Packsize.Test()) {
  55. Debug.LogError("[Steamworks.NET] Packsize Test returned false, the wrong version of Steamworks.NET is being run in this platform.", this);
  56. }
  57. if (!DllCheck.Test()) {
  58. Debug.LogError("[Steamworks.NET] DllCheck Test returned false, One or more of the Steamworks binaries seems to be the wrong version.", this);
  59. }
  60. try {
  61. // If Steam is not running or the game wasn't started through Steam, SteamAPI_RestartAppIfNecessary starts the
  62. // Steam client and also launches this game again if the User owns it. This can act as a rudimentary form of DRM.
  63. // Once you get a Steam AppID assigned by Valve, you need to replace AppId_t.Invalid with it and
  64. // remove steam_appid.txt from the game depot. eg: "(AppId_t)480" or "new AppId_t(480)".
  65. // See the Valve documentation for more information: https://partner.steamgames.com/documentation/drm#FAQ
  66. if (SteamAPI.RestartAppIfNecessary(AppId_t.Invalid)) {
  67. Application.Quit();
  68. return;
  69. }
  70. }
  71. catch (System.DllNotFoundException e) { // We catch this exception here, as it will be the first occurence of it.
  72. Debug.LogError("[Steamworks.NET] Could not load [lib]steam_api.dll/so/dylib. It's likely not in the correct location. Refer to the README for more details.\n" + e, this);
  73. Application.Quit();
  74. return;
  75. }
  76. // Initialize the SteamAPI, if Init() returns false this can happen for many reasons.
  77. // Some examples include:
  78. // Steam Client is not running.
  79. // Launching from outside of steam without a steam_appid.txt file in place.
  80. // Running under a different OS User or Access level (for example running "as administrator")
  81. // Ensure that you own a license for the AppId on your active Steam account
  82. // If your AppId is not completely set up. Either in Release State: Unavailable, or if it's missing default packages.
  83. // Valve's documentation for this is located here:
  84. // https://partner.steamgames.com/documentation/getting_started
  85. // https://partner.steamgames.com/documentation/example // Under: Common Build Problems
  86. // https://partner.steamgames.com/documentation/bootstrap_stats // At the very bottom
  87. // If you're running into Init issues try running DbgView prior to launching to get the internal output from Steam.
  88. // http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx
  89. m_bInitialized = SteamAPI.Init();
  90. if (!m_bInitialized) {
  91. Debug.LogError("[Steamworks.NET] SteamAPI_Init() failed. Refer to Valve's documentation or the comment above this line for more information.", this);
  92. return;
  93. }
  94. s_EverInialized = true;
  95. }
  96. // This should only ever get called on first load and after an Assembly reload, You should never Disable the Steamworks Manager yourself.
  97. private void OnEnable() {
  98. if (s_instance == null) {
  99. s_instance = this;
  100. }
  101. if (!m_bInitialized) {
  102. return;
  103. }
  104. if (m_SteamAPIWarningMessageHook == null) {
  105. // Set up our callback to recieve warning messages from Steam.
  106. // You must launch with "-debug_steamapi" in the launch args to recieve warnings.
  107. m_SteamAPIWarningMessageHook = new SteamAPIWarningMessageHook_t(SteamAPIDebugTextHook);
  108. SteamClient.SetWarningMessageHook(m_SteamAPIWarningMessageHook);
  109. }
  110. }
  111. // OnApplicationQuit gets called too early to shutdown the SteamAPI.
  112. // Because the SteamManager should be persistent and never disabled or destroyed we can shutdown the SteamAPI here.
  113. // Thus it is not recommended to perform any Steamworks work in other OnDestroy functions as the order of execution can not be garenteed upon Shutdown. Prefer OnDisable().
  114. private void OnDestroy() {
  115. if (s_instance != this) {
  116. return;
  117. }
  118. s_instance = null;
  119. if (!m_bInitialized) {
  120. return;
  121. }
  122. SteamAPI.Shutdown();
  123. }
  124. private void Update() {
  125. if (!m_bInitialized) {
  126. return;
  127. }
  128. // Run Steam client callbacks
  129. SteamAPI.RunCallbacks();
  130. }
  131. }

-----------------------------------------------------------------------------------------------------
 
 

第二步:

如何提交游戏版本

在提交游戏之前先对内容上传软件进行配置:

1、找到sdk\tools\ContentBuilder\scripts目录,该目录下有两个配置文件名需要更改

   app_build_自己的APPID.vdf,  depot_build_自己的APPID.vdf

2、假如我的APP ID 为 "55220"  ,修改app_build_55220,"appid","depots"内容如下:

  1. "appbuild"
  2. {
  3. "appid" "<span style="color:#ff0000;background-color: rgb(255, 204, 153);">55220</span>"
  4. "desc" "Your build description here" // description for this build
  5. "buildoutput" "..\output\" // build output folder for .log, .csm & .csd files, relative to location of this file
  6. "contentroot" "..\content\" // root content folder, relative to location of this file
  7. "setlive"   "" // branch to set live after successful build, non if empty
  8. "preview" "0" // to enable preview builds
  9. "local" ""  // set to flie path of local content server
  10. "depots"
  11. {
  12. "<span style="color:#ff0000;background-color: rgb(255, 204, 153);">55221</span>" "depot_build_<span style="color:#ff0000;background-color: rgb(255, 204, 153);">55221</span>.vdf"
  13. }
  14. }

修改depot_build_55221,修改 "DepotID" ,"ContentRoot","LocalPath" 内容如下:

  1. "DepotBuildConfig"
  2. {
  3. // Set your assigned depot ID here
  4. "DepotID" "<span style="font-size: 14.4px; font-family: Lato, proxima-nova, "Helvetica Neue", Arial, sans-serif; background-color: rgb(255, 204, 153);"><span style="color:#ff0000;">55221</span></span>"
  5. // Set a root for all content.
  6. // All relative paths specified below (LocalPath in FileMapping entries, and FileExclusion paths)
  7. // will be resolved relative to this root.
  8. // If you don't define ContentRoot, then it will be assumed to be
  9. // the location of this script file, which probably isn't what you want
  10. "ContentRoot"   "<span style="color:#ff0000;background-color: rgb(255, 204, 153);">D:\SDK硬盘位置\steamworks_sdk_138a\sdk\tools\ContentBuilder\content\</span>"
  11. // include all files recursivley
  12. "FileMapping"
  13. {
  14. // This can be a full path, or a path relative to ContentRoot
  15. "LocalPath" "<span style="color:#ff0000;background-color: rgb(255, 204, 153);">.\windows_content\*</span>"
  16. // This is a path relative to the install folder of your game
  17. "DepotPath" "."
  18. // If LocalPath contains wildcards, setting this means that all
  19. // matching files within subdirectories of LocalPath will also
  20. // be included.
  21. "recursive" "1"
  22. }
  23. // but exclude all symbol files
  24. // This can be a full path, or a path relative to ContentRoot
  25. "FileExclusion" "*.pdb"
  26. }

3、找到sdk\tools\ContentBuilder\content目录在目录下新增文件夹 windows_content

4、复制需要提交的游戏文件至 windows_content 目录下

5、找到sdk\tools\ContentBuilder\目录下的runbuild.bat右击编辑 更改内容如下:

  1. builder\steamcmd.exe +loginsteam用户名 密码 +run_app_build_http ..\scripts\app_build_自己的APPID.vdf
 
游戏测试无误的时候就双击runbuild.bat 等待上传成功了 
 

暂时先写这么多,后面还会更新 steamwork商店的一些配置

 
 
注:博文转自http://blog.csdn.net/tonye129/article/details/54311481

【转】独立游戏如何对接STEAM SDK的更多相关文章

  1. 独立游戏《Purgatory Ashes》的经验与总结

    1.引子 游戏的灵感萌生于2015年,当时只有一些概念性的设计图. 后来我利用资源商店的素材搭建了最早的原型. 游戏的最终画面: 早期以D.P作为代号进行开发,来源于两个单词的缩写 Devil Pro ...

  2. 半年收入超2亿RMB 独立游戏开发者的艰苦创业路

    一款叫做<监狱建筑师>的模拟经营游戏,目前在Steam平台获得了3000万美元(近2亿元)以上的收入.这款游戏由英国独立工作室Introversion Software发布,而团队最困难的 ...

  3. Unity3D独立游戏开发日记(二):摆放建筑物

    在沙盒游戏里,能自由建造是很重要的特点,比如说风靡全球的<我的世界>,用一个个方块就能搭建出规模宏大的世界.甚至有偏激的人说,没有自由建造,就不是一个真正的沙盒游戏.的确,沙盒游戏的魅力有 ...

  4. Unity3D独立游戏开发日记(一):动态生成树木

    目前写的独立游戏是一个沙盒类型的游戏.游戏DEMO视频如下: 提到沙盒类型的游戏,就有人给出了这样的定义: 游戏世界离现实世界越近,自由度.随机度越高才叫沙盒游戏.所谓自由度,就是你在游戏里想干啥就干 ...

  5. 独立游戏大电影 原名(Indie.Game)

    电影链接 独立游戏大电影 感觉很不错呢!!

  6. 用Qt制作的Android独立游戏《吃药了》公布

           一个多月的努力最终有了回报,我自己研究制作的独立游戏<吃药了>.最终在360应用商店上线了.        这一款游戏呢.使用的是Qt开发的.事实上开发这款简单的应用之前.我 ...

  7. funhub 独立游戏团队诚邀策划,美术,技术,QA 大大加入(可远程办公)

    我们刚成立的的独立游戏团队,base:广州,团队陆陆续续已经有 6 个成员了,现在还缺的岗位有策划,美术.不过有其 他岗位的仁人志士也可加入. 另外,我们支持远程办公,这是互联网行业的天然优势,一定要 ...

  8. air游戏接入小米支付sdk

    小米支付sdk要求在Application.onCreate中进行初始化 为了这个初始化搞了半天,最终搞定了.今天将更改的步骤记录下了. 1. 创建ANE.ANE的创建就不罗嗦了,这里须要注意一点,这 ...

  9. unity独立游戏开发日志2018/09/22

    f::很头痛之前rm做的游戏在新电脑工程打不开了...只能另起炉灶... 还不知道新游戏叫什么名...暂且叫方块世界.(素材已经授权) 首先是规划下场景和素材文件夹的建立. unity常用的文件夹有: ...

随机推荐

  1. dede织梦如何防止被黑客入侵渗透?

    dede精简设置篇:避免被hack注射挂马 精简设置篇:不需要的功能统统删除.比如不需要会员就将member文件夹删除.删除多余组件是避免被hack注射的最佳办法.将每个目录添加空的index.htm ...

  2. latex 插图排版

    LaTeX的图片插入及排版   LaTeX中一般只直接支持插入eps(Encapsulated PostScript)格式的图形文件, 因此在图片插入latex文档之前应先设法得到图片的eps格式的文 ...

  3. node.js后台快速搭建在阿里云(二)(pm2和nginx篇)

    前期准备 阿里云服务器 node.js pm2 express nginx linux(推荐教程:鸟哥的私房菜) 简介 嗯……我只是个前端而已 在第一部分说完了express篇. 后面继续项目的部署, ...

  4. mysql数据类型double和decimal区别详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt336 实数是带有小数部分的数字.然而,它们不只是为了存储小数部分,也可以使用 ...

  5. setAttribute设置无效

    我发现ie浏览器中动态用setAttribute设置style属性值始终不能设置,经过一番查找发现了这篇文字 http://webcenter.hit.edu.cn/articles/2009/05- ...

  6. mysql时间戳的获取

    时间戳函数:current_timestamp() 在此位置添加时间戳函数. 然后整体的写法就是下图这样: 根据当前时间戳更新有没有打钩将决定你的时间是什么时间(一个是数据完成写入的时间,一个时间戳回 ...

  7. [转载]浏览器事件window.onload、onfocus、onblur、ons

    原文地址:浏览器事件window.onload.onfocus.onblur.onscroll和resize作者:lilyxiao <html> <head> <titl ...

  8. MySQL(四)--蠕虫复制、查询

    1 蠕虫复制 蠕虫复制:从已有的数据中去获取数据,然后将数据又进行新增操作,数据成倍增加. 表创建高级操作:从已有创建新表(复制表结构) create table 表名 like 数据库.表名; 蠕虫 ...

  9. Beta版本测试报告以及Beta版本发布说明

    Beta版本测试报告 请根据团队项目中软件的需求文档.功能说明.系统设计和Beta阶段的计划安排,写出软件的测试过程和测试结果,并回答下述问题. 在测试过程中总共发现了多少bug?每个类别的bug分别 ...

  10. java继承中的初始化顺序

    初始化顺序:父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父类的非静态变量(父类的非静态代码块)-->父类的构造函数-->子类 ...