前言
你是否曾想过:玩家在哪个关卡弃坑最多?广告收益到底怎么样?新手引导有多少人跳过?这些问题的答案,都藏在埋点数据里。今天我们就来聊聊 TapDB 埋点那些事儿,让你从数据小白变身分析达人!
一、什么是埋点?为什么要埋点?
1.1 通俗理解
埋点就是在游戏里装"监控摄像头"。
想象一下,你在游戏里装了无数个隐形摄像头:
- 玩家进入了哪个关卡 → 记下来
- 玩家看了多长时间广告 → 记下来
- 玩家在第几关弃坑了 → 记下来
这些摄像头记录的数据,就是埋点数据。
1.2 埋点能帮我们做什么?
场景对比:
| 场景 | 没有埋点 | 有埋点 |
|---|---|---|
| 关卡难度 | 感觉第3关太难了 | 第3关通过率只有32%,需要调整 |
| 广告收益 | 好像没人看广告 | 双倍收益广告最受欢迎,占65% |
| 新手引导 | 引导应该没问题吧 | 43%的玩家在第5步跳过引导 |
一句话总结:埋点让你的决策有数据支撑,而不是靠感觉。
二、埋点设计:如何设计一个好的埋点方案?
2.1 核心原则
原则一:能合并就合并
很多新手喜欢一个动作一个事件,结果埋了几百个事件,自己都记不住。
❌ 错误示范:
AdSignIn → 补签广告 AdDoubleIncome → 翻倍广告 AdAddGuest → 加客广告 AdGetRes → 资源广告 ...(还要继续吗?)
✅ 正确示范:
AdWatch(一个事件搞定) └── ad_type: sign_in / double_income / add_guest / get_res
用 ad_type 这个参数区分不同类型,一个事件解决所有广告场景!
原则二:属性名要统一
同一个东西,到处用不同的名字,分析时会崩溃。
❌ 错误示范:
事件A用:levelId、level_id、LevelID 事件B用:stageId、stage_id
✅ 正确示范:
所有事件统一用:level_id
原则三:命名要有规律
| 类型 | 命名风格 | 示例 |
|---|---|---|
| 事件名 | PascalCase | StartLevel、AdWatch、GuideEvent |
| 属性名 | snake_case | level_id、ad_type、bonus_income |
三、代码怎么写?实战教学
3.1 最重要的规则:井号前缀
这是 TapDB 的特殊要求:自定义属性必须加井号前缀!
| 场景 | 需要加井号 |
|---|---|
| CSV 导入后台 | 不需要 |
| 代码上报数据 | 必须加 |
✅ 正确写法:
{ "#level_id", "level_1" }
{ "#ad_type", "double_income" }
❌ 错误写法(数据会上报,但属性无法识别):
{ "level_id", "level_1" }
3.2 常见埋点代码示例
1. 简单事件(无参数)
// 用户登录成功
Analytics.Event("UserLogin");
// 游戏加载完成
Analytics.Event("FinishLoading");
2. 带参数的事件
// 开始关卡
Analytics.Event("StartLevel", new Dictionary()
{
{ "#level_id", "level_1" }
});
// 关卡详情(多参数)
Analytics.Event("LevelDetail", new Dictionary()
{
{ "#level_id", "level_1" },
{ "#result", "pass" }, // pass 或 fail
{ "#duration", 120 }, // 时长(秒)
{ "#income", 1000 } // 收入
});
3. 复合事件(用 action 区分)
// 拼图游戏 - 开始
Analytics.Event("JigsawEvent", new Dictionary()
{
{ "#action", "start" },
{ "#jigsaw_id", 1 }
});
// 拼图游戏 - 完成
Analytics.Event("JigsawEvent", new Dictionary()
{
{ "#action", "finish" },
{ "#jigsaw_id", 1 }
});
看到没?同一个事件,用 action 参数区分不同状态,清晰又简洁!
四、后台操作:CSV 批量导入
4.1 准备 CSV 文件
TapDB 支持批量导入事件配置,格式如下:
event_name,event_desc,status,remark,bind_prop_names
StartLevel,开始关卡,display,关卡开始时触发,level_id
LevelDetail,关卡详情,display,每局结束时触发,level_id|result|duration|income
AdWatch,观看广告,display,观看广告时触发,ad_type|level_id|bonus_income
4.2 字段说明
| 字段 | 必填 | 说明 |
|---|---|---|
| event_name | 是 | 事件名(PascalCase) |
| event_desc | 是 | 事件描述 |
| status | 否 | display(显示)/ hide(隐藏) |
| remark | 否 | 备注说明 |
| bind_prop_names | 否 | 绑定的属性,多个用竖线分隔 |
4.3 上传步骤
- 登录 TapDB 后台
- 选择项目 → 事件管理 → 批量操作
- 上传 CSV 文件
- 确认导入
注意:CSV 里的属性名不需要加井号!
五、数据查询:SQL 实战
数据上报后,怎么查?用 SQL!
5.1 基础查询
-- 查询最近两天的关卡事件
SELECT *
FROM hive_saas1.tapdb."events"
WHERE "$part_date" IN ('2026-03-01', '2026-03-02')
AND name IN ('LevelStart', 'LevelDetail')
LIMIT 10000
5.2 查询指定属性
SELECT
name,
data."#level_id" AS level_id,
data."#result" AS result,
data."#duration" AS duration
FROM hive_saas1.tapdb."events"
WHERE "$part_date" IN ('2026-03-01', '2026-03-02')
AND name = 'LevelDetail'
重点:属性要用 data."#属性名" 格式!
5.3 计算关卡通过率
SELECT
data."#level_id" AS level_id,
SUM(CASE WHEN data."#result" = 'pass' THEN 1 ELSE 0 END) AS pass_count,
SUM(CASE WHEN data."#result" = 'fail' THEN 1 ELSE 0 END) AS fail_count,
ROUND(
SUM(CASE WHEN data."#result" = 'pass' THEN 1 ELSE 0 END) * 100.0 / COUNT(*),
2
) AS pass_rate
FROM hive_saas1.tapdb."events"
WHERE "$part_date" BETWEEN '2026-03-01' AND '2026-03-07'
AND name = 'LevelDetail'
GROUP BY data."#level_id"
运行结果示例:
| level_id | pass_count | fail_count | pass_rate |
|---|---|---|---|
| level_1 | 8500 | 1500 | 85.00% |
| level_2 | 7200 | 1800 | 80.00% |
| level_3 | 4500 | 3500 | 56.25% |
一看就知道:第3关太难了,通过率才56%,该调整了!
5.4 查询广告类型分布
SELECT
data."#ad_type" AS ad_type,
COUNT(*) AS event_count
FROM hive_saas1.tapdb."events"
WHERE "$part_date" BETWEEN '2026-03-01' AND '2026-03-07'
AND name = 'AdWatch'
GROUP BY data."#ad_type"
ORDER BY event_count DESC
5.5 常用字段速查表
| 字段 | 说明 |
|---|---|
| "$part_date" | 时间分区(查询必加) |
| name | 事件名称 |
| distinct_id | 用户唯一标识 |
| data."#xxx" | 自定义属性 |
六、避坑指南
6.1 常见错误
| 错误 | 后果 | 解决方案 |
|---|---|---|
| 忘记加井号前缀 | 属性无法识别 | 代码上报时必须加井号 |
| 属性名不统一 | 无法跨事件分析 | 统一使用 snake_case |
| 事件过度拆分 | 事件数量爆炸 | 用 action 参数合并 |
| 埋点时机错误 | 数据不准确 | 在正确的业务节点触发 |
6.2 最佳实践
- 埋点前先设计:先列出需要分析的问题,再设计埋点方案
- 命名要有文档:维护一份属性字典,团队共用
- 上线前先测试:在后台验证数据是否正确上报
- 定期清理:废弃的事件和属性及时清理
七、总结
速记口诀
事件命名 PascalCase 属性命名 snake_case 代码上报加井号 CSV 导入不加井号 相似事件用 action 属性复用要统一 查询记得加分区 数据驱动做决策
7.2 学习路线
| 阶段 | 目标 |
|---|---|
| 入门 | 先学会基本的 Event 上报 |
| 进阶 | 设计复合事件,用 action 区分 |
| 高级 | 用 SQL 分析数据,指导产品决策 |
参考资料
- TapDB 官方文档:https://developer.taptap.cn/docs/sdk/tapdb/
- 事件导入模板:见上文 CSV 格式