成就系统是玩家荣耀的档案馆:击杀成就、收集成就、社交成就、探索成就四大类几十项,每项成就给成就点数,点数兑换成就勋章。成就的实现要点是成就的触发监听、点数的累计与勋章的兑换体系。
local ACHIEVEMENTS = {
kill_1000 = { name = "千军斩", cond = { type = "kill", target = 1000 }, points = 10 },
rich_man = { name = "富甲一方", cond = { type = "gold", target = 10000000 }, points = 15 },
couple = { name = "神仙眷侣", cond = { type = "marry" }, points = 20 },
}
function QF.AchieveCheck(plr, eventType, value)
for id, ach in pairs(ACHIEVEMENTS) do
if ach.cond.type == eventType and not plr:HasAchievement(id) then
local progress = plr:AchieveProgress(id, value)
if progress >= ach.cond.target then
plr:GrantAchievement(id)
plr.achievePoints = (plr.achievePoints or 0) + ach.points
QF_SendMsg(plr, "成就达成【" .. ach.name .. "】+" .. ach.points .. " 点")
end
end
end
end
成就的条件由事件类型与目标值定义:击杀类听击杀事件、财富类听金币事件、社交类听婚姻事件。达成即发放点数并通知,成就的达成瞬间是玩家的高光时刻,通知的弹窗仪式感必须有。
function QF.MedalExchange(plr, medalId)
local medal = MEDALS[medalId]
if (plr.achievePoints or 0) < medal.cost then
return false, "成就点数不足"
end
plr.achievePoints = plr.achievePoints - medal.cost
plr:EquipMedal(medalId)
QF_Broadcast(plr.name .. " 佩戴了成就勋章【" .. medal.name .. "】")
return true
end
成就勋章用点数兑换佩戴:铜勋章 50 点、银勋章 150 点、金勋章 400 点,勋章佩戴在名片上展示,点数的消费出口让成就的收集有终极目标。成就的分类页签与进度条让玩家随时知道自己离下一个成就有多远,收集进度的可视化是成就系统的发动机。稀有成就(首个满级、首杀 BOSS)的全服播报让成就的稀缺被看见。
成就的达成率分布统计,全员达成的成就缺乏区分度,达成率低于百分之一的成就检查是否门槛过高。
成就监听的事件曾经轮询全表,每帧遍历几十个成就的性能开销在低端机可见,事件订阅制改造让成就只听相关事件。成就点数的兑换曾经支持倒扣,点数不够可以负数兑换的漏洞被滥用,兑换的前置校验与数值下限校验补上。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 三个月的主线剧情跨度太长,老玩家回坑记不住剧情走向。回顾手册把每个章节的关键节点做成时间线卡片:章节名、…
实战应用:用在哪里 每次全量更新包两百兆,玩家在流量下望而却步。差分分发只下发新旧版本的差异块:一兆的全量更新压成八十兆差分…
实战应用:用在哪里 新玩法灰度上线后“观察一下”是最模糊的指令。观察指标清单把观察期变成可执行的检查表:参与率、异常率、资源…
实战应用:用在哪里 行会义卖活动把流拍装备低价义卖,宣称收益全捐新手基金,活动结束后玩家质疑“钱去哪了”。复盘把公益金流向做…
实战应用:用在哪里 技能升级要消耗技能书与金币,升完才发现收益不如预期是常见的挫败。试算面板在升级前模拟展示升级后的属性变化…
实战应用:用在哪里 道士的群体治疗一次奶全队,无衰减的群体治疗会让治疗量溢出成无敌盾。治疗量衰减机制:每多一名目标,单体治疗…