今日速览
- 成就/统计(Stats & Achievements)是 Steam 帮你云端保存的持久数据,跟着玩家账号走,会自动展示在个人资料页——你几乎不用自己写存档逻辑。
- 关键顺序:先在 Steamworks 后台「App Admin」定义并 Publish,再写代码。没发布就调用,API 会直接报错、读不到也写不进。
- 统计只有三种类型:
INT(32 位整数)、FLOAT(32 位浮点)、AVGRATE(滑动平均)。成就本身可以绑定一个「进度统计」,数值到线自动解锁。 - GodotSteam 侧常用就几个函数:
Steam.setAchievement()/Steam.storeStats()/Steam.setStatInt()/Steam.getStatInt()/Steam.getAchievement()。 - GodotSteam 3.28 / 4.14 起(SDK 1.61)统计与成就由 Steam 客户端启动时自动同步,不再需要手动请求回调。
核心学习内容
1. 成就的「数据源」在后台,不在代码里
新手常以为成就靠代码定义,其实 Steamworks 的逻辑是:后台是唯一真相源。在 App Admin → Stats & Achievements 里,你先给每个统计和成就起一个 API Name(字符串,比如 kill_boss_1、highscore),这段字符串就是代码里访问它的钥匙。属性包括:
- 统计:
Type(INT/FLOAT/AVGRATE)、Increment Only(只增不减,适合「总击杀数」)、Max Value/Min Value(防作弊上限)、Aggregated(Steam 帮你算全服总和)。 - 成就:
Display Name、Description、Hidden?(隐藏成就达成前不显示)、Progress Stat(绑定一个统计做进度条)、达成/未达成两套图标。
注意两个坑:上传或改完必须点 Publish,否则 API 侧不可见;默认上限 100 个成就,达到 Profile Features 门槛后才能加更多。成就名和图标要全年龄友好——这是审核会看的。
2. GodotSteam 接线:三个函数覆盖 90% 场景
装好 GodotSteam 后,初始化成功(Steam.steamInitEx() 状态 OK)即可用全局 Steam 单例。推荐用一个字典、以 API Name 为键来集中管理:
var achievements: Dictionary = {"first_kill": false, "beat_game": false}
var statistics: Dictionary = {"highscore": 0, "total_kills": 0}
解锁一个成就,本质是「设置状态 → 推送」:
func unlock(api_name: String) -> void:
if Steam.getAchievement(api_name).get("achieved", false):
return # 已解锁,直接跳过,避免重复弹窗
Steam.setAchievement(api_name)
Steam.storeStats() # 必须调用,才会写服务器并弹 Steam 通知
改统计同理:Steam.setStatInt("total_kills", 42) 之后一样要 Steam.storeStats()。storeStats() 是那个真正「提交」的动作,漏掉它,前面都只是改了内存,Steam 弹窗也不会出现。读数据用启动时的一次性遍历即可:Steam.getStatInt(name)、Steam.getAchievement(name) 填进字典。
3. 进度型成就与隐藏成就
想做「击杀 50 个敌人」这种进度条成就,不要每杀一个就解锁一次,而是:让成就绑定 Progress Stat(如 total_kills),你只负责 setStatInt 累加,Steam 到线自动解锁并显示进度条。隐藏成就则用来保护剧透(比如「在黑屏前掉头离开」),后台勾 Hidden? 即可。这套设计能让玩家「有理由再玩一次」,也天然适合做全成就收集。
🎯 DeepSeek 提示词
① 生成成就清单与后台配置表(策划前置)
你是一名资深独立游戏策划,熟悉 Steam 成就系统。我的游戏是:[一句话类型,如"2D 横版平台跳跃,共 6 大关"]。
请为我设计 12 个成就,要求:
- 3 个"流程必得"(通关即解锁),9 个"挑战型",其中至少 2 个隐藏成就
- 同时最多 2 个需要"刷"(重复劳动),其余鼓励探索/技巧
输出一张 Markdown 表格,列:API Name(小写下划线) | Display Name(中文) | 描述 | 类型(流程/挑战/隐藏) | 是否需要进度统计 | 绑定的统计名与解锁阈值。
只输出表格,不要解释。
② 生成 GodotSteam 成就管理单例
你是 Godot 4 + GodotSteam 专家。请用 GDScript 写一个 Autoload 单例 SteamAchievements,功能:
1) 用字典集中管理成就与统计的 API Name(我稍后替换)
2) init 时遍历拉取已获得的成就与统计,填入字典
3) 提供 unlock(api_name) 和 add_stat(stat_name, amount),内部自动判重、调用 storeStats()
4) 在非 Steam 环境(编辑器调试)下全部降级为写日志,不报错
约束:Godot 4 语法;snake_case 函数名;关键行加中文注释;不要引入第三方插件。给出完整脚本 + 一句如何注册 Autoload。
③ 审查成就代码的常见坑(Debug 模板)
下面是我用 GodotSteam 写的成就代码。请按以下清单逐条检查并给出修改后的完整代码:
[ ] 定义并 Publish 顺序是否说清(后台没发布会报错)
[ ] 是否漏掉 storeStats() 的调用
[ ] 是否重复解锁导致重复弹窗(应先 getAchievement 判重)
[ ] INT/FLOAT 类型是否与后台一致
[ ] Increment Only 统计是否存在"减少"的写法
[ ] 编辑器/离线环境是否会崩
代码:
```(粘贴你的代码)```
请先列问题清单,再给最终代码,最后用一句话说明每个改动的原因。
学习心得
今天的最大收获是**「先配置、后编码」**的次序感——这和用 DeepSeek 做游戏是同一种思维:你得先把「真相源」(后台定义 / 给 AI 的项目上下文)固定下来,代码只是接线。成就系统正好能把我们前几天做的存档、通关流程、数值统计串起来,是「从能玩到耐玩」的关键一步,也是最便宜的长期留存工具。对独立开发者来说,一套设计得当的成就,几乎等于给游戏加了一倍的可玩内容量。
明日关注
- 在 Steamworks 后台把本文的成就清单一比一建出来并 Publish,记录每个 API Name。
- 给游戏装一个
SteamAchievementsAutoload,先只在编辑器里跑通降级逻辑。 - 挑 3 个「进度型成就」做实验,验证「绑定 Progress Stat 自动解锁」是否生效。
本文由自动化学习流水线每日生成,坚持即学即记。
评论