新玩家的前 30 分钟决定留存:走哪条路、接什么任务、什么时候第一次打怪、什么时候第一次获得装备,节奏设计得顺,玩家就留下来了。新手村的引导动线设计是玩法策划与后端配合的教科书案例。
---登录触发:新手动线的起点
function login(actor)
if actor:GetLevel() > 10 then return end
if getplayvar(actor, "HUMAN", "guide_step") == "" then
setplayvar(actor, "HUMAN", "guide_step", 1, 1)
newpicktask(actor, 10001)
sendmsg(actor, 1, "跟随指引,击败 3 只稻草人吧")
end
end
---杀怪触发:引导任务的进度推进
function killmon(actor, mon)
if mon:GetName() == "稻草人" then
local step = tonumber(getplayvar(actor, "HUMAN", "guide_step")) or 0
if step == 1 then
local n = tonumber(getplayvar(actor, "HUMAN", "guide_kill")) or 0
setplayvar(actor, "HUMAN", "guide_kill", n + 1, 1)
if n + 1 >= 3 then
giveitem(actor, "木剑", 1, 1, "引导奖励")
setplayvar(actor, "HUMAN", "guide_step", 2, 1)
sendmsg(actor, 1, "获得木剑!去找村长接下一个任务")
end
end
end
end
动线的每一步用 guide_step 变量串联:杀 3 只稻草人得木剑、找村长对话学第一个技能、跑一次地图传送、加入一次组队,四个节拍覆盖战斗、社交、探索三大系统。节拍的间隔控制在 5 到 8 分钟,多巴胺的间隔决定了玩家是否继续。
function playlevelup(actor, oldLevel, newLevel)
if newLevel >= 10 and tonumber(getplayvar(actor, "HUMAN", "guide_step")) < 4 then
-- 升级过快:补发跳过的引导奖励
giveitem(actor, "木剑", 1, 1, "引导补偿")
setplayvar(actor, "HUMAN", "guide_step", 4, 1)
end
end
大号带小号的升级速度会跳过动线,levelup 触发里的补发逻辑保证跳级的玩家不缺关键装备。动线的漏斗数据(每一步的完成人数)按天出报表,掉人最多的步骤就是要优化的步骤。新手村的怪物密度与任务奖励的数值配合动线:前 30 分钟不缺药、不缺钱、不迷路。
30 分钟留存率与动线漏斗的每日看板,第四步(组队)的完成率是新手指引是否清晰的试金石。
引导任务曾经可以被大号代打,完成标记打了玩家却什么都没体验,任务触发时增加"本人造成伤害"的判定。动线的步骤曾经可以跳序,玩家先接了组队任务没有战斗力,步骤的顺序锁死在 guide_step 的推进逻辑里。
动线的每一步都配一条服务端提示文案,文案的语气要像师父带徒弟而不是系统通告。动线变量全部持久化,跨天与重登不断线。引导的跳过权给回归玩家:老账号回流时动线自动折叠成可选项,尊重老玩家的经验。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 离线挂机收益不设折损时出现荒诞对比:挂机一周的收益超过手玩三天,勤奋上线变成劣势行为,日常玩法的参与率被自己的离线…
设计初衷 连续登录奖励的断签规则是留存系统的双刃剑:零容忍时,一次出差就清零 29 天连击,玩家的愤怒远超奖励本身的价值;无…
设计初衷 面板战力 50000 的玩家在竞技场打不过 38000 的对手——面板公式与实战表现的偏差超过两成时,玩家的信任崩…
底层原理 全量深拷贝保证整个隔离,但代价随数据规模线性放大:一张 500 键、三层嵌套的配置表,全深拷贝 2.1ms——热路…
底层原理 直接删除(表置 nil、清变量)是不可逆操作:删错一个玩家的邮件配置,找回只能靠备份。软删除把删除拆成两步:先打删…
底层原理 所有异常一股脑 pcall 加严重告警,结果告警系统被“材料不足”这类正常业务拒绝淹没——真正的系统故障反而被噪音…