任务与日常系统
概述
任务是玩家行为的"引导器":用目标与奖励把玩家带到玩法深处。任务系统的难点在于类型多(每日/每周/主线/支线/成就,规则各不相同)、进度追踪(实时且准确)、奖励投放(阶梯引导留存)与活跃度体系(聚合日常行为的运营抓手)。本文设计完整的任务系统。
一、任务类型
1.1 分类与周期
| 类型 | 周期 | 示例 | 特点 |
|---|---|---|---|
| 每日任务 | 每日刷新 | 登录、对局 3 场 | 高频、奖励小 |
| 每周任务 | 每周刷新 | 胜场 20 场 | 低频、奖励中 |
| 主线任务 | 一次性 | 通关第 3 章 | 长期引导 |
| 支线任务 | 一次性 | 结识 5 位好友 | 玩法探索 |
| 成就任务 | 长期 | 累计胜 100 场 | 见成就章节 |
1.2 任务定义
QuestDef(配置表):
questId、名称、描述
type(DAILY/WEEKLY/MAIN/SIDE/ACHIEVEMENT)
targetType(对局/胜场/充值/好友/等级…)
targetValue(目标值)
rewards(奖励列表)
preQuest(前置任务,链式解锁)
unlockLevel(解锁等级)
refreshCycle(日/周/永不)任务模板:
模板 = 事件类型 + 目标数值 + 奖励
新增任务只加配置,不改代码
同类任务共用进度计算逻辑二、进度追踪
2.1 事件驱动
与成就系统同构,任务进度靠事件驱动:
事件 → 任务进度:
BattleEndEvent → 对局/胜场类任务
RechargeEvent → 充值类任务
LevelUpEvent → 等级类任务
FriendAddEvent → 社交类任务
流程:
业务发布事件 → 任务服务监听
→ 匹配进行中的任务 → 更新进度
→ 达标 → 可领取奖励2.2 任务状态与存储
任务状态机:
LOCKED(未解锁)→ ACTIVE(进行中)→ FINISHED(可领奖)→ CLAIMED(已领)
存储:
player_quest 表:(playerId, questId, progress, status, refreshDate)
Redis 缓存热任务进度进度并发:
同玩家串行处理事件
进度累加原子(Redis INCR 或条件更新)
达标判定一次(防重复达标)2.3 每日刷新
每日 0 点刷新:
生成当日每日任务(可从任务池随机选)
重置已完成状态
数据清理(昨日任务归档)
刷新设计详见每日刷新章节三、奖励投放策略
3.1 奖励设计
任务奖励三件套:
货币(小额,保证基本获得感)
道具(实用消耗品)
活跃度(驱动活跃度体系)
阶梯设计:
前期任务简单奖励丰厚 → 建立习惯
中后期逐步加码目标 → 维持动力
周常/主线大奖 → 长线留存3.2 投放节奏
投放原则:
即时反馈:完成即领(或一键领取)
每日保底:日常任务可支撑基础消耗
总量控制:任务产出与消耗匹配(防通胀)
引导设计:
未完成任务红点提示
奖励可预览
关键任务强引导(跳转对应玩法)四、活跃度体系
4.1 活跃度模型
活跃度是聚合日常行为的单一指标,用于解锁活跃奖励:
活跃度来源:
每日任务完成(每项 +N)
参与玩法(对战/副本/社交)
消费行为(抽卡/购买)
活跃度等级:
活跃值分段(20/50/80/100)
每段解锁一份奖励
满活跃额外大奖4.2 实现
ActivityService:
addActivity(playerId, value, reason)
getActivity(playerId)
claimActivityReward(playerId, tier)
存储:
Redis Hash:activity:{playerId}(当日活跃 + 已领档位)
每日刷新清零活跃度刷新:
每日 0 点重置(与每日任务同批处理)
跨日数据隔离(按日期分 Key)五、实现要点
核心接口:
onEvent(PlayerEvent)
getQuestList(playerId, type)
claimQuestReward(playerId, questId)
addActivity(playerId, value, reason)
claimActivityReward(playerId, tier)工程注意:
任务配置热更新
事件与任务解耦(MQ/事件总线)
每日刷新统一调度(见每日刷新章节)
奖励发放复用经济系统接口(幂等)常见坑:
进度并发覆盖 → 同玩家串行
重复领奖 → 状态机 + 条件更新
刷新与领取竞态 → 刷新加锁/按日期隔离
任务无限刷 → 每日任务池限量、周常限量与其他系统衔接:
活跃度奖励 → 商城/邮件
任务事件源 → 对战/社交/经济全链路
成就任务 → 成就系统
每日刷新 → 运营系统每日刷新章节