下载状态、查询与游戏时间

Steam 创意工坊下载状态、查询与游戏时间统计

游戏接入 Steam 创意工坊后,还需要知道内容何时可用、如何筛选项目,以及何时记录项目的游戏时间。本页面向实现内容浏览器、加载器和专用服务器的开发者,说明相关接口之间的配合。

工坊内容由创作者提交,经 Steam 分发给玩家或服务器后加载

图:原创流程示意,依据 Steamworks 创意工坊文档绘制。

订阅并不等于已经安装

Steam 启动游戏前会更新已安装的工坊项目;新订阅但尚未下载的项目可能在游戏启动后才于后台下载安装。调用 GetItemState 判断项目状态,结合 GetItemDownloadInfo 展示待更新项目的下载进度。GetItemState 返回的是可组合的位标志:k_EItemStateSubscribed 表示已订阅,k_EItemStateInstalled 表示已安装但仍可能过期,k_EItemStateNeedsUpdate 表示需要更新,k_EItemStateDownloading 和 k_EItemStateDownloadPending 表示下载正在进行或等待。通过位运算检查各标志:已安装且无需更新时可直接检查 GetItemInstallInfo 的返回值并取得本地路径;如果调用了 DownloadItem 且返回 true,则按下文等待下载结果。下载总字节数在下载开始后才有效。

若需要主动触发下载或更新,可调用 DownloadItem。设置高优先级会暂停当前正在进行的其他下载并立即开始该项目的下载,因此应谨慎使用。如果返回 true,等待 DownloadItemResult_t 后再读取安装信息或访问文件,并核对回调中的应用 ID 和结果。对于未订阅的项目,下载内容可能只是临时缓存;不要把缓存当作永久安装。

游戏应监听 ItemInstalled_t,在安装或更新后重新检查状态。玩家取消订阅后,官方说明项目会在游戏退出后移除,因此运行中的游戏应管理好文件引用,而不是假设取消订阅会立即释放所有资源。加载器还应对缺失文件、错误格式和版本不兼容提供清晰提示。

本地禁用与加载顺序

当前官方接口中的 GetNumSubscribedItems 和 GetSubscribedItems 默认排除本地禁用的项目;两者都可通过 bIncludeLocallyDisabled 参数纳入这些项目。在游戏服务器调用时,这两个函数返回 0,因此服务器应通过其他方式获得需要的项目 ID。SetItemsDisabledLocally 可设置本地禁用状态;禁用不等于取消订阅。请以所用 SDK 头文件确认接口签名是否支持上述参数。

订阅列表默认按订阅时间排列。玩家可以在 Steam 客户端调整顺序,游戏也可用 SetSubscriptionsLoadOrder 设置指定项目的本地顺序,未列入的项目按订阅时间排序。加载器仍应根据自己的依赖规则处理冲突,并向玩家解释顺序变化。

依赖信息与内容加载

AddDependency 可为项目添加另一个工坊项目作为依赖,并通过 AddUGCDependencyResult_t 检查异步结果。对于普通项目,官方将其描述为软依赖:它会在网页展示,也可从 SteamUGCDetails_t 的子项目数量和 GetQueryUGCChildren 查询获得。依赖信息本身不替代游戏的兼容性检查;加载器应向玩家明确提示所需内容。若父项目是合集,添加的子项则进入该合集。

让查询返回所需字段

查询流程分为创建请求、设置条件、发送请求、读取结果和释放句柄。CreateQueryUserUGCRequest 面向与用户有关的内容,CreateQueryAllUGCRequest 查询匹配的全部内容,CreateQueryUGCDetailsRequest 用于查询指定项目 ID 的详情。对支持筛选的查询,可在发送前用 AddRequiredTag、AddExcludedTag 或 AddRequiredKeyValueTag 约束结果;前两者对详情查询句柄不适用。查询全部内容时可用 SetSearchText 搜索标题或描述。设置筛选时应检查各方法返回值,并查阅所用 SDK 对查询类型的限制。

有些字段需要显式请求。例如,要读取开发者元数据,可在发送前设置 SetReturnMetadata,回调后通过 GetQueryUGCMetadata 获取;类似地,键值标签和额外预览也有各自的返回选项及读取方法。收到 SteamUGCQueryCompleted_t 后检查结果,通过 GetQueryUGCResult 读取条目,完成后调用 ReleaseQueryUGCRequest 释放资源。官方指南中的列表分页查询每页最多返回 50 条,页码从 1 开始;按 ID 查询详情的限制请参阅对应 API。

用项目 ID 在服务器下载

专用服务器可从服务器运营者或客户端取得 PublishedFileId_t,再调用 DownloadItem 获取临时副本,等待下载结果并通过 GetItemInstallInfo 定位文件。如需为多个使用同一安装目录的服务器设置独立工坊目录,可在执行任何 UGC 命令前调用 BInitWorkshopForGameServer,传入服务器 depot ID 和内容存储目录的绝对路径;官方说明非游戏服务器调用或工坊正在更新内容时会返回 false。服务器应独立验证来源、项目 ID、格式和游戏兼容性;客户端提供的 ID 不代表内容一定适合服务器使用。

统计实际使用时间

开始使用某些工坊项目时,调用 StartPlaytimeTracking 并传入项目 ID;项目不再参与游戏时,使用 StopPlaytimeTracking,或用 StopPlaytimeTrackingForAllItems 停止全部跟踪。应用关闭时跟踪会自动停止。

开发者可在 CreateQueryAllUGCRequest 中选择按项目总游戏时间、平均游戏时间或游戏场次排序,包括趋势期与累计指标。趋势期由 SetRankedByTrendDays 设置。只有在内容实际进入和退出使用状态时维护跟踪,相关统计才有助于理解玩家如何使用内容。

除客户端接口外,官方实现指南还指向 ISteamRemoteStorage Web API,用于共享内容列表等服务端场景;具体方法的权限与参数应以对应接口文档为准,不应将服务端密钥放入客户端。

参考 Steam 创意工坊实现指南 和 ISteamUGC 接口参考。