【转】独立游戏如何对接STEAM SDK

独立开发者在对接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

时间: 2024-10-01 03:36:30

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

成为独立游戏制作人需要注意的六件事(转)

一方面,从技术上来说,如今的游戏制作门槛越来越低已经成为不争的事实.Unity3D.Cocos2dx这样简单易用的引擎让很小的团队也能做出 精彩的游戏.另一方面,行业内频传的诸如A团队月流水达到数百万,B团队又被数亿收购这样的新闻,也刺激着很多勇敢者想带几个弟兄出来闯一闯,做一些不一 样的东西.但是成为一名优秀的独立游戏制作人,真的只需要懂得游戏开发.有几个信得过的搭档吗?事实上并没有这么简单.今天葡萄君来告诉大家成为独立游戏 制作人需要注意的六件事. 1.收入 成为独立游戏制作人,首先要面对收

第一只独立游戏,时隔九个月reject了5次,终于奇迹般地“被上架”

这本来是去年九月便开发出来的游戏,最初的名字叫<放学别走>,App Store第一次却游戏名字和题材涉及校园暴力直接拒绝掉, 甚至要求把logo也换掉,当时可是不能忍! 我个人是第一次接触做游戏,之前一直在创业公司打滚做各种社交APP,对独立游戏的爱也是源于一部纪录片<独立游戏大电影>,能拥有一款属于自己的indie game对我来说就像买了车购了房一样能了却一个梦想, 于是在去年公司的项目失败后,辞职回老家把自己关了一个多月后静静的经历多个日与夜楞是开发出来了. 可是App St

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

1.引子 游戏的灵感萌生于2015年,当时只有一些概念性的设计图. 后来我利用资源商店的素材搭建了最早的原型. 游戏的最终画面: 早期以D.P作为代号进行开发,来源于两个单词的缩写 Devil Prototype. 去年秋季我离开了当时的公司开始全职开发这款游戏,鉴于游戏的体量和一定的情怀原因,我选择了线上开发的形式招募一些队友 在群内发了一些信息以及一阵子磨合后,最终拉拢了3名小伙伴入伙,总共4人. 期间遇到了许许多多的难题,以及若干未解决的问题.但最终仍然发布到了steam商店上 开发时间7

这一轮百亿级独立游戏投资热,背后藏着巨头们的“小算计”

独立游戏,就是有别于商业游戏而言的一种存在,它更强调打破固有游戏模式的套路,形成自己的创意.而2017年它的突然蹿红,某种意义上和苹果在AppStore为其开设独立游戏永久专区,并频频在首页上进行推介有莫大关系. 里程碑式的产品自然是<纪念碑谷2>这款美国产的独立游戏,在2017年6月6日上架后,其连续19天在App Store下载榜保持第一.而最让国内游戏圈振奋的是:刚刚出现下滑,开发商ustwo Games就立刻在推特表示,游戏购买量一半都是中国玩家贡献的,并表示了感谢. 毫不掩饰.前来拉

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

目前写的独立游戏是一个沙盒类型的游戏.游戏DEMO视频如下: 提到沙盒类型的游戏,就有人给出了这样的定义: 游戏世界离现实世界越近,自由度.随机度越高才叫沙盒游戏.所谓自由度,就是你在游戏里想干啥就干啥,想开车就开车,想走路就走路.想盖房子就盖房子,没有城管来找你麻烦.那么随机度,就是每天发生的事情不能一样,做的任务也不会就一条线路可走. 在我的沙盒游戏里,地形上的树木,岩石等都是随机生成的,这样不同的人玩的地图都会不一样.当然如果最后能做到地形也随机生成那就更完美了. 下面我就讲下树木随机生成

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

在沙盒游戏里,能自由建造是很重要的特点,比如说风靡全球的<我的世界>,用一个个方块就能搭建出规模宏大的世界.甚至有偏激的人说,没有自由建造,就不是一个真正的沙盒游戏.的确,沙盒游戏的魅力有很大一部分是能自由构建一个游戏世界.看着自己一砖一瓦搭建起一个城堡世界会很有成就感的. 现如今的手游,大多数就是一个争斗和炫耀的世界.不管是传奇类的狂霸拽酷,还是连连看,消消乐等好友排名,就是消费国人的虚荣心.其实,游戏是第九艺术,要上升到艺术的角度.在游戏里,玩家需要一种情感的宣泄和寄托以及体验. 说了这么

张书乐:把独立游戏纳入“计划”,市场何在?

2017年的游戏圈里,除了吸金大户<王者荣耀>外,或许第二热门话题,就属于独立游戏这个备受巨头瞩目的东东了. 就在7月末结束的Chinajoy时,一个在一线游戏公司打拼了多年的程序员,很兴奋的在微信上给我留了个言:我决定不再依附任何游戏公司,自己出来做独立游戏了. 文/张书乐(人民网.人民邮电报专栏作者) 新著有<微博运营完全自学手册> 当我问及为何突然有次想法时,他分享了一则Chinajoy期间的新闻:腾讯发布"极光计划".新浪游戏推出"V计划&qu

再致总理一封信 - 我要替中国独立游戏说句话

总理您好, 我是上海巨斧网络的陈宇,是一名普通的手游从业者. 国家新闻出版广电总局针对手游市场出台了一条新政,即2016年7月1日起,所有手机游戏需要广电总局审批才可上架. 这件事在业内引发了强烈的反响,中小企业哀嚎一片,广州天海网络的喻平也给您写了两封公开信,算上我这封已经是第三封了,虽然不知道这些信能不能传到您手里,但该政策着实影响到了万千的中国独立开发者,因此我有一些话必须得说. 一.什么是独立游戏? 一般意义上对独立游戏的定义,是指相对于商业游戏制作而存在的另一种游戏制作行为,在没有商业

观点:独立游戏开发者创业路上的11个‘坑’(转)

随着手游市场的快速增长,越来越多的开发者入场,很多有创意的独立开发者在刚进入游戏行业的时候都有非常优秀的创意,但是,从创意到成功的游戏是有距离的,而且在走向成功的路上,会有各种各样的‘坑’,最近,英国的一个独立团队 CEO 就分享了自己遇到过的 11 个‘坑’,以下是 GameLook 编译的内容: 去年 12 月,我应邀去一个活动上做演讲,主要是讲独立开发者们需要避开的 10 个‘坑’.我从来没有想过自己会被冠以‘CEO’的头衔,因为我必须承认的是,我自己过去也是个独立开发者. 在创建 Gif