【steam接入】如何将unity游戏接入steam(steamworks)

本文档提供Steamworks.NET集成步骤及常见问题解决方案,包括SDK安装、Unity项目集成、C#接口使用等,并针对appid设置、错误排查、地区限制等问题给出指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Steamworks.NET,请确保成为steam的开发者(要在steam提交游戏,需要一次性缴纳100美元费用)

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

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

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

Steamwork安装步骤

  • 下载 .unitypackage Stable (7.0.0) 或者从 Github 克隆
  • 导入下载的所有文件到项目 Assets/ 目录下.
  • 打开unity项目,会自动生成steam_appid.txt到项目的主目录下.
  • 打开 steam_appid.txt 并将 480 修改为自己的 AppId.
  • 编辑\Plugins\Steamworks.NET\types\SteamTypes\AppId_t.cs,将public static readonly AppId_t Invalid = new AppId_t(0x0);将0x0修改为自己的app_id
  • 重启unity,保证 steam_appid.txt 已生效.
  • 安装sdk完成.

 

如何使用

  • 下载SteamManagers.cs
  • 将SteamManager.cs脚本挂在GameObject上,steam会自动生成单例
  • 完整C#接口请点击查看

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

 

 

// The SteamManager is designed to work with Steamworks.NET
// This file is released into the public domain.
// Where that dedication is not recognized you are granted a perpetual,
// irrevokable license to copy and modify this files as you see fit.
//
// Version: 1.0.3

using UnityEngine;
using System.Collections;
using Steamworks;

//
// The SteamManager provides a base implementation of Steamworks.NET on which you can build upon.
// It handles the basics of starting up and shutting down the SteamAPI for use.
//
[DisallowMultipleComponent]
class SteamManager : MonoBehaviour {
	private static SteamManager s_instance;
	private static SteamManager Instance {
		get {
			return s_instance ?? new GameObject("SteamManager").AddComponent<SteamManager>();
		}
	}

	private static bool s_EverInialized;

	private bool m_bInitialized;
	public static bool Initialized {
		get {
			return Instance.m_bInitialized;
		}
	}

	private SteamAPIWarningMessageHook_t m_SteamAPIWarningMessageHook;
	private static void SteamAPIDebugTextHook(int nSeverity, System.Text.StringBuilder pchDebugText) {
		Debug.LogWarning(pchDebugText);
	}

	private void Awake() {
		// Only one instance of SteamManager at a time!
		if (s_instance != null) {
			Destroy(gameObject);
			return;
		}
		s_instance = this;

		if(s_EverInialized) {
			// This is almost always an error.
			// The most common case where this happens is the SteamManager getting desstroyed via Application.Quit() and having some code in some OnDestroy which gets called afterwards, creating a new SteamManager.
			throw new System.Exception("Tried to Initialize the SteamAPI twice in one session!");
		}

		// We want our SteamManager Instance to persist across scenes.
		DontDestroyOnLoad(gameObject);

		if (!Packsize.Test()) {
			Debug.LogError("[Steamworks.NET] Packsize Test returned false, the wrong version of Steamworks.NET is being run in this platform.", this);
		}

		if (!DllCheck.Test()) {
			Debug.LogError("[Steamworks.NET] DllCheck Test returned false, One or more of the Steamworks binaries seems to be the wrong version.", this);
		}

		try {
			// If Steam is not running or the game wasn't started through Steam, SteamAPI_RestartAppIfNecessary starts the 
			// Steam client and also launches this game again if the User owns it. This can act as a rudimentary form of DRM.

			// Once you get a Steam AppID assigned by Valve, you need to replace AppId_t.Invalid with it and
			// remove steam_appid.txt from the game depot. eg: "(AppId_t)480" or "new AppId_t(480)".
			// See the Valve documentation for more information: https://partner.steamgames.com/documentation/drm#FAQ
			if (SteamAPI.RestartAppIfNecessary(AppId_t.Invalid)) {
				Application.Quit();
				return;
			}
		}
		catch (System.DllNotFoundException e) { // We catch this exception here, as it will be the first occurence of it.
			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);

			Application.Quit();
			return;
		}

		// Initialize the SteamAPI, if Init() returns false this can happen for many reasons.
		// Some examples include:
		// Steam Client is not running.
		// Launching from outside of steam without a steam_appid.txt file in place.
		// Running under a different OS User or Access level (for example running "as administrator")
		// Ensure that you own a license for the AppId on your active Steam account
		// If your AppId is not completely set up. Either in Release State: Unavailable, or if it's missing default packages.
		// Valve's documentation for this is located here:
		// https://partner.steamgames.com/documentation/getting_started
		// https://partner.steamgames.com/documentation/example // Under: Common Build Problems
		// https://partner.steamgames.com/documentation/bootstrap_stats // At the very bottom

		// If you're running into Init issues try running DbgView prior to launching to get the internal output from Steam.
		// http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx
		m_bInitialized = SteamAPI.Init();
		if (!m_bInitialized) {
			Debug.LogError("[Steamworks.NET] SteamAPI_Init() failed. Refer to Valve's documentation or the comment above this line for more information.", this);

			return;
		}

		s_EverInialized = true;
	}

	// This should only ever get called on first load and after an Assembly reload, You should never Disable the Steamworks Manager yourself.
	private void OnEnable() {
		if (s_instance == null) {
			s_instance = this;
		}

		if (!m_bInitialized) {
			return;
		}

		if (m_SteamAPIWarningMessageHook == null) {
			// Set up our callback to recieve warning messages from Steam.
			// You must launch with "-debug_steamapi" in the launch args to recieve warnings.
			m_SteamAPIWarningMessageHook = new SteamAPIWarningMessageHook_t(SteamAPIDebugTextHook);
			SteamClient.SetWarningMessageHook(m_SteamAPIWarningMessageHook);
		}
	}


	// OnApplicationQuit gets called too early to shutdown the SteamAPI.
	// Because the SteamManager should be persistent and never disabled or destroyed we can shutdown the SteamAPI here.
	// 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().
	private void OnDestroy() {
		if (s_instance != this) {
			return;
		}

		s_instance = null;

		if (!m_bInitialized) {
			return;
		}

		SteamAPI.Shutdown();
	}

	private void Update() {
		if (!m_bInitialized) {
			return;
		}

		// Run Steam client callbacks
		SteamAPI.RunCallbacks();
	}
}

 

接入问题:

 

*使用默认的appid 480可以获取到接口,替换为自己的appid报错steam api初始化失败?

应该是steam帐号里面没有该appid的游戏权限。

*Failed to load 'Assets/Plugins/x86_64/CSteamworks.dll' with error '找不到指定的模块。

还没找到解决办法

*下载报错 Steam安装失败(程序配置文件不可用)或 Failed to start game (invalid app config)

如果测试帐号可以下载安装,而黄色或者红色key不可安装,则是因为应用商店页面清单未完成并提交Valve审核,审核通过才可。具体可以参见steam开发者讨论区 https://steamcommunity.com/groups/steamworks/discussions/0/523897023725510452/

*如何只允许在Steam的某些地区销售?

需要联系Steam客服,说明限制地区和理由 https://partner.steamgames.com/home/contact

*如何测试应用?  

在后台申请红色激活码,使用steam通过激活码进行下载测试。
红色激活码(只能内部使用)、黄色激活码(外部使用)、透明激活码(发布后使用)

*.ico和icns文件如何制作?

使用ico制作软件如IcoFX制作多个尺寸的ico文件,在线做只能输出一个尺寸。需要尺寸16 32 48 64 128 256越多越好。

*Mac发布后,steam安装显示0bytes。

相关程序包与 DLC商店程序包、促销或特殊用途程序包中添加所有depot即可。

*发布mac后打开闪退

发布steam应用mac版本时,确保playersetting下的Mac AppStore Validation取消掉,不然steam版本打开会闪退

### 如何在 Unity 游戏中实现 Steam 支付集成 #### 准备工作 为了使 Unity 游戏支持 Steam 支付,开发者需先确保已注册 Steamworks 开发者账号并拥有有效的 API Key。此外,在 Steamworks 后台创建应用,并获取 App ID 是必不可少的操作[^1]。 #### 添加 Steam SDK 到 Unity 项目 下载适用于 UnitySteamworks.NET 插件包,将其解压后导入至 Unity 工程目录下。此插件作为桥梁连接 UnitySteam API 功能模块,其中包括微交易接口服务。 #### 编写支付逻辑代码 利用 Steamworks.NET 提供的方法来处理购买请求。下面是一个简单的 C# 脚本实例,展示了如何初始化 Steam 微交易系统以及发起商品购买流程: ```csharp using UnityEngine; using Facepunch.Steamworks; public class SteamPaymentManager : MonoBehaviour { private static uint _appId; void Start() { // 初始化 Steam 应用程序ID if (!SteamClient.Init(_appId)) Debug.LogError("Failed to initialize steam"); var result = PurchaseItem("item_name", 1); if (result.Success) { Debug.Log($"Purchase successful!"); } else { Debug.LogError($"Purchase failed with error code {result.Result}"); } } public Result<PurchaseResultDetail> PurchaseItem(string itemName, int quantity){ return SteamMicroTxn.Start(itemName, quantity); } } ``` 请注意替换 `_appId` 为实际的应用编号,并根据具体需求调整 `itemName` 参数值以匹配待售物品名称。 #### 测试与验证 完成上述编码之后,应该通过 Steamworks 内部测试环境仔细检验整个购物流程是否顺畅无误。这一步骤对于保障用户体验至关重要,任何潜在问题都应在这一阶段被识别并修正。 #### 发布前最后检查 当确认所有功能均能稳定运作时,则可前往 Steamworks 控制面板设定最终售价及相关细节信息,随后按照既定计划安排游戏上线时间表。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼蛋-Felix

如果对你有用,可以请我喝杯可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值