服务器的创意⼯坊⽂件,Steam创意⼯坊实现指南
简介Steam 创意⼯坊系统使⽤后端存储、前端⽹页的形式,便于存储、整理、排序、评分及下载游戏或应⽤程序。
本⽂提供了为产品实现 Steam 创意⼯坊的技术细节。 在开始将 Steam 创意⼯坊与您的游戏整合前,请参见 Steam 创意⼯坊概览,了解更多您能使⽤的各类创意⼯坊整合的定义及信息,以及如何最⼤程度利⽤ Steam 各类⼯具。
在⼀般情况下,您游戏的顾客会使⽤购买游戏时您提供的⼯具修改或创建全新的内容, 并将其通过⼯具内置表格提交给 Steam 创意⼯坊。其他顾客可在 Steam 社区的 Steam 创意⼯坊中浏览、排序、评分或订阅希望增添⾄游戏中的物品, 并通过 Steam 下载这些物品。 如果您在游戏中注册了 ISteamUGC::ItemInstalled_t 回调,便可以调⽤ ISteamUGC::GetItemInstallInfo 获取安装位置并从该⽂件夹直接读取数据, 游戏便会以适合游戏及所创建内容的⽅式辨识新内容。
Steam 创意⼯坊类型、货币化及最佳实践参见 Steam 创意⼯坊 ⼀⽂,了解更多您能使⽤的各类创意⼯坊整合的定义及信息,以及如何最⼤程度利⽤ Steam 各类⼯具。
管理 Steam 创意⼯坊可见度Steam 创意⼯坊是由 Steam 管理的⽹站,列出所有分享的内容,允许⽤户
对社区中可见内容进⾏投票或留⾔。 应⽤程序在创意⼯坊中默认为不对公众开放可见, 以此防⽌不打算通过 Steam 创意⼯坊门户共享的内容被公开,除⾮将创意⼯坊设定为公开。
创意⼯坊可见状态的设置步骤如下:
打开 Steamworks ⽹站上的应⽤程序登录页⾯。
点击“编辑 Steamworks 设置”
在“创意⼯坊”选项卡中,选择“通⽤”
在页⾯右边,到“可见状态”栏。
使⽤单选按钮选择可见度,可以为仅开发者可见、开发者和测试⼈员可见、顾客和开发者可见,以及所有⼈可见。
在“发布”选项卡中选择“准备发⾏”
点击“发布到 Steam”即可完成流程并发布变更。注意:如果要将可见度更改为所有⼈可见,必须完成创意⼯坊清单上的项⽬,包括品牌、标题、描述等,并⾄少有⼀项内容公开可见。
技术概览参见 Steamworks SDK,了解通过 ISteamUGC API 共享和消费⽤户⽣成内容的流程。 所公开的⽅法提供了分享创意⼯坊物品内容并可随后在 Steam 创意⼯坊或应⽤程序中到相关内容的途径。
创意⼯坊 API 必须通过由 SteamUGC() 返回的指针才能访问。
⽰例:
SteamAPICall_t hSteamAPICall = SteamUGC()->CreateItem( SteamUtils()->GetAppID(),
k_EWorkshopFileTypeMicrotransaction );
在游戏或应⽤程序中启⽤ ISteamUGC将创意⼯坊物品上传⾄ Steamworks 后端之前,必须先设置两项配置,即配置 Steam 云配额、与启⽤ ISteamUGC API。
Steam 云⽤于存储与创意⼯坊物品相关的预览图⽚。 请按下列步骤配置 Steam 云配额:
前往应⽤管理员⾯板中的 Steam 云设置页⾯。
将“每个⽤户的字节配额”以及“每个⽤户的⽂件量配额”设置为适合储存预览图⽚的值。
点击“保存”
在“发布”选项卡中选择“准备发⾏”
点击“发布到 Steam”即可完成流程并发布变更。
启⽤ ISteamUGC API 步骤如下:
前往应⽤管理员⾯版中的 Steam 创意⼯坊配置页⾯。
到“附加配置选项”栏⽬。
勾选“为⽂件传输启⽤ ISteamUGC”。
点击“保存”。
在“发布”选项卡中选择“准备发⾏”。
点击“发布到 Steam”即可完成流程并发布变更。设置完成后即可通过 API 上传创意⼯坊物品。
创建并上传内容创建并上传创意⼯坊内容流程简单,可重复进⾏,如下⽅的流程图所⽰。
创建创意⼯坊物品所有创意⼯坊物品⾃调⽤ ISteamUGC::CreateItem 起开始存在。
nConsumerAppId 变量应包含游戏或应⽤程序的 App ID。 如果创意⼯坊物品创建⼯具有单独的 App ID,切勿传⼊该App ID。EWorkshopFileType 为枚举类型,定义⽂件如何在社区中共享。 有效值为:
k_EWorkshopFileTypeCommunity:此类型⽂件⽤于描述由⽤户上传且可由社区内任何⼈下载的⽂件。 通常⽤于共享⽤户创建的模组。
k_EWorkshopFileTypeMicrotransaction:此类型⽂件⽤于描述由⽤户上传的⽂件,但其⽬的为仅供游戏决定是否添加⼊官⽅内容。 其他⽤户⽆法通过创意⼯坊下载该类型⽂件,但可在社区中查看并进⾏评价。
Team Fortress 2 中也使⽤该实施⽅法。
⾸先查看 m_eResult,以确保物品已成功创建。
执⾏调⽤结果处理程序时,读取并保存 m_nPublishedFileId 值,以便将来更新创意⼯坊物品时可⽤(如保存于与创建⼯具相关的项⽬⽂件中)。
还应查看 m_bUserNeedsToAcceptWorkshopLegalAgreement 变量,如果为 true,需将⽤户重新定向⾄接受法律协议。 参见创意⼯坊法律协议,了解更多信息。
上传创意⼯坊物品创意⼯坊物品创建完毕且 PublishedFileId_t 值返回后,即可填⼊创意⼯坊物品内容并上传⾄ Steam 创意⼯坊。
更新调⽤完成后,调⽤ ISteamUGC::SubmitItemUpdate 即可开始 Steam 创意⼯坊的上传流程。
执⾏调⽤结果处理程序时,检查 m_eResult 以确认上传是否成功。
注意:⼀旦调⽤便⽆法取消物品更新与上传。
如有需要,可使⽤ ISteamUGC::GetItemUpdateProgress 跟踪上传过程。
punBytesProcessed 和 punBytesTotal 可⽤于提供⽤户界⾯控制输⼊,例如显⽰上传进度的进度栏。
punBytesTotal 可在上传进程中根据物品更新状态进⾏更新。
⽤创建创意⼯坊物品相同的⽅法,确认⽤户是否已接受法律协议, 以防⽤户并⾮该物品初创者,⽽是在对现有物品进⾏编辑。steam交易链接
附注创意⼯坊物品原先指定为单个⽂件。 但有了 ISteamUGC,创意⼯坊物品是包含⽂件的⽂件夹的表现形式。
如果创意⼯坊物品因应⽤程序使⽤需要⽽需额外元数据,可调⽤ ISteamUGC::SetItemMetadata 将元数据加⼊物品。 这些元数据可从查询返回,⽆需下载安装实际内容。
之前我们建议将该元数据存储于创意⼯坊物品⽂件夹内的⼀个⽂件当中,您仍可照样执⾏。
使⽤内容使⽤创意⼯坊内容分为两类:物品订阅和物品安装。
物品订阅绝⼤部分的创意⼯坊物品订阅通过 Steam 创意⼯坊门户进⾏。 这是对所有游戏与应⽤程序通⽤的已知位置,因此⽤户可在创意⼯坊⽹站上定期查并订阅物品。
但 ISteamUGC 提供了两种⽅法,⽤编程⽅式订阅和取消订阅创意⼯坊物品,以⽀持对游戏中物品订阅的管理。
ISteamUGC::SubscribeItem:订阅⼀个创意⼯坊物品。 会尽快下载并安装该物品。
ISteamUGC::UnsubscribeItem:取消订阅⼀个创意⼯坊物品。 退出游戏后会移除该物品。
另外还有两个枚举⽤户已订阅物品的⽅法。
接收外部订阅操作通知⽤户通过任何机制(如 ISteamUGC 或 Steam 创意⼯坊⽹站)订阅⼀个⽂件或取消订阅时,可收到游戏内通知。
结构中也包含与创意⼯坊物品关联的应⽤程序 ID(m_unAppID)。 ⽆论正在运⾏什么应⽤程序,所有物品订阅均会调⽤处理程序,因此请检查该应⽤程序 ID 与执⾏中程序的 ID 是否⼀致。
物品安装知晓物品订阅信息后,便可利⽤剩下的使⽤⽅法。 这些⽅法将物品下载与安装状态反馈回游戏, 然后基于下列规则,创意⼯坊物品通过 Steam 客户端⾃动下载:
Steam 客户端即将启动游戏或应⽤程序时,便会下载并安装所有已更新的应⽤程序 depot。
如有需要,会更新所有现有已安装创意⼯坊物品。
启动游戏或应⽤程序。
新订阅但尚未下载的创意⼯坊物品将在后台进⾏下载与安装。
已订阅⽂件将按订阅顺序下载⾄客户端。
下载创意⼯坊物品时,Steam 的下载页⾯将以特定的横幅显⽰创意⼯坊物品正在下载。注意:使⽤ Steam 客户端的“验证游戏⽂件完整性”功能也可导致下载创意⼯坊物品。
由于游戏会在新订阅物品下载并安装前启动,剩余的使⽤⽅法⽤于监控管理安装进度, 或是在游戏内订阅物品时⽤于提供实时安装状态。
创意⼯坊物品状态
创意⼯坊物品下载进度
开始下载创意⼯坊物品或提⾼其优先顺序ISteamUGC::DownloadItem
将 bHighPriority 设置为 true,即可暂停所有进⾏中的下载并⽴即开始下载此创意⼯坊物品。
如果⽤户并未订阅该物品(例如匿名登录的游戏服务器),创意⼯坊物品会下载并临时存放于缓存中。
此⽅法只对 ISteamUGC 创建的创意⼯坊物品有效, 对旧版 ISteamRemoteStorage 创意⼯坊物品则⽆效。
ISteamUGC::DownloadItemResult_t 回调结构中包含与创意⼯坊物品关联的应⽤程序 ID(m_unAppID)。 ⽆论正在运⾏什么应⽤程序,所有物品下载均会调⽤处理程序,因此请检查该应⽤程序 ID 与执⾏中程序的 ID 是否⼀致。
获取创意⼯坊物品本地副本信息
创意⼯坊物品已安装或更新通知
查询内容ISteamUGC 接⼝提供了枚举各种 Steam UGC(如创意⼯坊物品、截图、视频等)的灵活⽅式。
根据情况不同可⽤不同⽅法进⾏查询,如查询与⽤户相关内容、查询所有内容或是以 ID 查询内容详情。
调⽤选项设置⽅法,⾃定义适合的查询:
查询⽤户 UGC 时
查询所有 UGC 时
ISteamUGC::SetMatchAnyTag:设置待处理的 UGC 查询返回的创意⼯坊物品须符合⼀个或多个标签,或是所有标签。
ISteamUGC::SetSearchText:设置待处理的 UGC 查询中物品字符串与标题相符还是与描述相符。
ISteamUGC::SetRankedByTrendDays:设置待处理的 UGC 查询中物品顺序是否按⼀定天数内物品排名进⾏更新。
查询任何⼀种 UGC 时
ISteamUGC::AddRequiredTag:给待处理的 UGC 查询增加标签, 只返回含有特定标签的 UGC。
ISteamUGC::AddExcludedTag:给待处理的 UGC 查询增加排除标签, 只返回不含特定标签的 UGC。
ISteamUGC::AddRequiredKeyValueTag:给待处理的 UGC 查询增加必须的键值标签, 只返回键为 [param]pKey[/param] 且值为[param]pValue[/param] 的创意⼯坊物品。
ISteamUGC::SetReturnOnlyIDs:设置待处理的 UGC 查询是否只返回 ID ⽽⾮所有详细信息, 在只需要部分信息时⾮常有⽤(如只需要⽤户收藏夹列表中的物品 ID 时。)
ISteamUGC::SetReturnMetadata:设置待处理的 UGC 查询是否返回开发者指定的元数据。
ISteamUGC::SetReturnChildren:设置待处理的 UGC 查询是否需要传回物品的⼦物品 ID。
ISteamUGC::SetLanguage:设置待处理的 UGC 查询返回的标题和描述所使⽤的语⾔。
ISteamUGC::SetAllowCachedResponse:设置待处理的 UGC 查询是否从特定时间段的缓存中返回查询结果。
分页结果每个查询可返回最多 50 项结果。 如果要对更多结果进⾏分页,可在查询中递增 unPage 参数(从 1 开始。)
游戏时间跟踪要跟踪创意⼯坊物品的游戏时间,只需以所希望跟踪物品的 ID 调⽤ISteamUGC::StartPlaytimeTracking 即可。 随后物品从游戏移除时,再以物品 ID 调⽤ ISteamUGC::StopPlaytimeTracking 来停⽌跟踪,或调⽤
ISteamUGC::StopPlaytimeTrackingForAllItems ⼀次性停⽌所有物品跟踪。
关闭应⽤程序时,游戏时间跟踪⾃动停⽌。
您也可使⽤ ISteamUGC::CreateQueryAllUGCRequest 在查询中以不同的游戏时间指标对物品进⾏排序。 以下是基于游戏时间的查询法:
删除创意⼯坊物品内容您可以调⽤ ISteamUGC::DeleteItem 来删除⼀件创意⼯坊物品。 请注意这样做将不会提⽰⽤户,且操作不可撤销。
Steamworks ⽰例:SpaceWar 集成Steamworks SDK 中的 Steamworks API ⽰例应⽤程序(SpaceWar)展⽰了⼀个 ISteamUGC API ⼦集。
CSpaceWarClient::LoadWorkshopItem 展⽰了如何检查创意⼯坊物品是否已下载并安装⾄磁盘中,及如何使⽤ISteamRemoteStorage::PublishedFileId_t 请求创意⼯坊物品信息。
CSpaceWarClient::LoadWorkshopItems 展⽰了如何获取当前⽤户为 SpaceWar 应⽤程序已订阅的创意⼯坊物品清单。
CSpaceWarClient::OnWorkshopItemInstalled 展⽰了⼀个 ISteamUGC::ItemInstalled_t 回调处理程序。
创意⼯坊法律协议在贡献者同意《Steam 创意⼯坊法律协议》前,创意⼯坊物品默认为隐藏状态。 为⽅便贡献者公开他们的物品,请按以下步骤进⾏:
在将物品提交⾄创意⼯坊的按钮旁添增⼀段⽂字,类似于“提交此物品即表明您同意了创意⼯坊服务条款”(包括链接)。
⽤户提交物品后,调⽤ ISteamFriends::ActivateGameOverlayToWebPage,将 pchURL 设为 steam://url/CommunityFilePage/,并将 替换为创意⼯坊物品 ID,以在浏览器窗⼝打开该物品的 Steam 创意⼯坊页⾯。这样可将作者定向⾄创意⼯坊页⾯,以便作者查看物品,必要时也可进⾏更多配置。此外也便于⽤户阅读并接受《Steam 创意⼯坊法律协议》。
Web API除上述⽅法外,Web API 接⼝也提供了类似功能,与基于社区的筛选 API 来⼀起列出所有分享内容。 请参阅 Web API 列表内的ISteamRemoteStorage 接⼝⽂件。
专⽤游戏服务器游戏服务器也可以⽤来下载和安装物品。
游戏服务器需有 PublishedFileId_t 信息⽅可请求创意⼯坊物品。该信息可由游戏客户端提供,或由服务器管理员设置。 随后可调⽤ISteamUGC::DownloadItem 获取创意⼯坊物品的临时副本。
若需更多有关这些 API ⽅法的信息,请参见上述物品安装部分。
SteamCmd 集成除 ISteamUGC API 之外, 命令⾏⼯具也可⽤于为测试⽬的创建和更新创意⼯坊物品。 由于此⼯具要求⽤户输⼊ Steam 凭据(我们不希望顾客提供),因此仅限于测试使⽤。
如要使⽤ 创建新的 Steam 创意⼯坊物品,⾸先须创建⼀个纯⽂本 VDF ⽂件, 并包含以下键值。
"workshopitem"
{
"appid" "480"
"publishedfileid" "5674"
"contentfolder" "D:\\Content\\workshopitem"
"previewfile" "D:\\Content\\preview.jpg"