成就系统是「低成本高感知」的留存工具:它不改变核心玩法,却给玩家提供了额外的小目标与身份认同。本 PRD 是《在线联机原型全集》的扩展篇之二,聚焦事件驱动的成就引擎,可横向接入任意联机原型。
1. 目标与验证点
| 编号 | 验证能力 | 说明 |
|---|---|---|
| A1 | 事件驱动判定 | 对局事件实时流式判定,延迟 < 100ms |
| A2 | 进度持久化 | 成就进度原子落库,跨端一致 |
| A3 | 解锁通知 | 弹窗/横幅触发,不打断对局 |
| A4 | 成就面板 | 分类浏览、进度条、已解锁态 |
| A5 | 运营埋点 | 解锁率、卡点统计,支撑迭代 |
一句话目标:给每个对局外目标配上「可量化进度 + 可感知反馈」,让玩家的努力被系统记住。
2. 系统架构
flowchart TD
A["Game Events"] -->|kafka/redis stream| B["Event Bus"]
B --> C["Achievement Engine"]
C -->|matched| D["Progress Store (Redis)"]
C -->|unlocked| E["Notify Service"]
E --> F["Client Banner"]
C -->|stats| G["Analytics (ClickHouse)"]
D --> H["Achievement Panel"]
说明:
- Event Bus:统一游戏事件流(对局结束、击杀、连胜、累计场次等)
- Achievement Engine:无状态判定器,规则可配置热更新
- Progress Store:Redis 存活跃进度,异步落库 Postgres
- Notify Service:解锁后推送到客户端,支持延迟/离线补发
3. 成就规则模型
3.1 三类典型成就
| 类型 | 示例 | 判定方式 |
|---|---|---|
| 一次性 | 首次获胜、完成新手引导 | 单事件到达即解锁 |
| 累积型 | 累计胜利 100 场、击败 1000 个 AI | 计数器累加到达阈值 |
| 条件型 | 无伤通关、单局连杀 5 人 | 对局内状态满足即解锁 |
3.2 规则配置 DSL
achievement:
id: "win_100"
name: "百胜传奇"
description: "累计获胜 100 场"
type: cumulative
event: "game_finished"
filter: "result == WIN"
counter: "total_wins"
threshold: 100
reward: "title:百胜"
关键设计:规则与代码解耦。运营改阈值、加成就,无需发版——配置热更新 + 判定引擎重载。
4. 进度管理与一致性
4.1 原子计数
// 累积型成就:Redis INCR 保证原子性,超阈值触发解锁
func (e *Engine) OnGameFinished(playerID string, result Result) error {
if result != WIN {
return nil
}
wins, err := redis.Incr(ctx, fmt.Sprintf("ach:win_100:%s", playerID))
if err != nil {
return err
}
if wins == 100 {
return e.Unlock(playerID, "win_100")
}
return nil
}
4.2 幂等与防重
解锁必须是幂等的:重复触发不重复发奖、不重复通知
进度回滚(如作弊清零)要有审计日志
跨端一致性:同一玩家多端进度以服务端为准
4.3 数据模型
| 表 | 字段 |
|---|---|
achievement_def | id、name、type、event、filter、threshold、reward |
player_achievement | player_id、achievement_id、progress、unlocked_at、unlocked |
5. 接口定义
| 模块 | 接口 | 描述 |
|---|---|---|
| Engine | POST /achievement/evaluate | 接收事件批量判定 |
| Progress | GET /achievement/progress/{playerId} | 查询全部成就进度 |
| Panel | GET /achievement/list?category= | 成就面板分类数据 |
| Notify | POST /achievement/notify | 推送解锁通知(内部) |
| Admin | PUT /achievement/def | 运营配置增改(后台) |
6. 解锁反馈设计
| 反馈 | 形式 | 原则 |
|---|---|---|
| 即时弹窗 | 横幅 + 成就名 + 图标 | 不阻断对局,3s 自动消失 |
| 首次解锁 | 全屏庆祝(可跳过) | 仅限稀有/里程碑成就 |
| 累积进度 | 面板进度条 + 百分比 | 持续目标感 |
| 奖励落地 | 称号/图标/货币 | 解锁后立刻可感知 |
设计心法:成就是「给玩家的自我叙述」。文案要具体、带情绪(「百胜传奇」优于「获得 100 场胜利」),奖励要与身份相关(称号、徽章)而非只有数值。
7. 运营埋点与迭代闭环
埋点维度:
- 解锁率:某成就到达阈值并被解锁的比例
- 卡点分布:玩家最常卡在哪个进度区间
- 回归率:解锁某成就后 7 日留存变化
迭代闭环:
看数据 → 调阈值/改文案/加成就 → 再测解锁率
核心指标:成就系统健康度 = 活跃玩家的「平均解锁成就数」随时间上升,而非一次性爆发。
8. 里程碑与验收
M1 事件总线接入(1 周)
✅ 对局事件可配置化路由到 Engine
M2 判定 + 进度持久化(1 周)
✅ 累积/条件/一次性三类均可正确解锁,重启不丢
M3 通知与面板(1 周)
✅ 解锁横幅、成就面板、进度条上线
M4 运营后台(1 周)
✅ 配置热更新生效,埋点报表可看
验收指标:事件到解锁判定 P99 < 100ms;并发解锁幂等(同事件重复不重发奖);进度跨端一致率 100%。
9. 相关原型衔接
本系统是横向能力,可接入全部 60 个原型:
- 接入#2 RPS:首次胜利、连胜 3 局
- 接入#16 简版 MOBA:单局击杀、全场最高输出
- 接入#21 异步远征:累计远征次数、单次远征时长
扩展篇定位:成就系统是「对局外目标」的基础设施。它与赛季与段位系统共同构成玩家成长的「记分牌」——先记录每一次努力,再给努力分级。
延伸阅读
- 「在线联机原型全集」目录(60 个原型全景) — 原型全景索引
- 观战与回放系统 — 让对局被看见(扩展篇之一)
- 「在线联机原型全集」第六章:AI 自治文明与永续世界(#51–#60) — 长期成长与演化
- [[products]] — 产品原型开发专题
- [[game]] — 游戏服务端实战
下一扩展篇:AI 陪练机器人。成就记录「你已经走了多远」,陪练让「继续变强」永远有人陪。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。