新玩家的前 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 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 脚本的规范靠人盯盯不过来:命名风格漂移、全局变量乱用、缩进混着来——风格检查器把这些规则的执行自动化。提…
实战应用:用在哪里 拍卖行的出价是一场与时间的博弈:出价的按钮、倒计时的紧迫、截拍瞬间的悬念——拍卖界面的要点是出价的流程、…
实战应用:用在哪里 强化连败七次是什么体验?幸运值机制给失败的玩家一个隐性的承诺:每次失败累加幸运值,幸运值越高下一次的成功…
实战应用:用在哪里 审计日志的价值在于不可抵赖:被改过的日志比没有日志更危险——纠纷的追溯、内部的追责都建立在「日志没被动过…
实战应用:用在哪里 活动结束给 3 万玩家发奖励:一次性群发让邮件表瞬间多 3 万行、投递的队列堵塞正常的通信。批量邮件的分…
实战应用:用在哪里 面对面的交易是传奇最经典的交互:两人面对面、各自放入物品与金币、双方确认后成交。交易的协议要点是会话的建…