上传工具:创建、更新与排错

Steam 创意工坊上传工具:创建、更新与排错

Steam 创意工坊上传工具需要处理项目创建、文件提交和异步结果,而不是只调用一次上传接口。本页面向游戏及工具开发者,展开项目 ID 的保存、提交阶段反馈以及测试时的常见排查路径。

创作者提交内容,经 Steam 工坊分发给玩家并由游戏加载的流程

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

从创建项目到准备更新

上传前,先准备游戏能识别的内容目录和预览图。工具调用 CreateItem 时,nConsumerAppId 使用消费内容的游戏 App ID;独立上传器有自己的 App ID 时也应传游戏 ID。用于玩家下载的社区内容通常选择 k_EWorkshopFileTypeCommunity;用于提交给开发者考虑是否纳入正式游戏的内容使用 k_EWorkshopFileTypeMicrotransaction,这类项目不通过工坊供玩家直接下载。

创建调用会异步返回结果。处理 CreateItemResult_t 时先检查 m_eResult,成功后保存 m_nPublishedFileId,例如将它保存在创作者的本地项目文件中。以后修改同一项目时,应使用这个 ID 进行更新,而非重新创建新项目。还要检查 m_bUserNeedsToAcceptWorkshopLegalAgreement,引导用户查看并接受协议。

提交内容和展示进度

用游戏 App ID 和项目 ID 调用 StartItemUpdate,取得更新句柄。按本次实际需要使用 SetItemTitle、SetItemDescription、SetItemUpdateLanguage、SetItemVisibility、SetItemTags、SetItemContent 和 SetItemPreview 等方法设置内容。SetItemContent 指向包含项目文件的文件夹;SetItemMetadata 可附加查询时取回的元数据,不必先下载整个项目。

SetItemContent 的目录和 SetItemPreview 的图片文件都应传本地绝对路径。逐项检查设置方法的布尔返回值;某项设置失败时先修正参数,避免继续提交缺少预期字段的更新。设置成功也只表示更新参数已被接受,最终上传是否成功仍由提交结果决定。

调用 SubmitItemUpdate 后,等待 SubmitItemUpdateResult_t 并检查其中的 m_eResult。更新结果同样可能要求用户接受协议。官方建议在提交按钮旁提供协议链接,提交后打开项目页面,让创作者检查内容并处理协议;用户未接受协议时项目默认隐藏。

使用 GetItemUpdateProgress 可读取阶段以及已处理和总字节数。总字节数可能随阶段变化,因此界面不宜假定它始终固定。官方说明提交后没有取消该次更新与上传的方法;工具应在提交前完成用户确认、文件检查,并在上传期间避免误导用户以为能撤销已提交的任务。

失败时先保留哪些信息

记录项目 ID、应用 ID、操作阶段与回调中的 EResult,让用户知道失败发生在创建、设置还是最终提交。排查上传和更新时可查看 Steam/workshopbuilds/depot_build_<appid>.log;下载和安装问题则查看 Steam/logs/Workshop_log.txt。日志可能包含用户环境信息,收集或共享前应提醒用户检查内容。

独立上传工具还需在游戏的 Workshop 配置中加入工具的 App Publish Permissions,并为游戏和工具两个应用设置 Steam Cloud 配额及发布设置。若创建或上传失败,先检查这些配置、Steam 客户端登录状态和文件路径,再根据返回结果定位原因。

删除操作需要单独设计

ISteamUGC::DeleteItem 可以删除工坊项目。官方明确指出此调用不会自动向用户提示,且删除不可撤销。若工具提供删除功能,应先清楚展示目标项目并由用户主动确认;不要把删除当作普通更新的回滚机制。

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