【游戏功能】
魂卫为什么只有三盏就不能多了?魂蜂偏要做成可以积累的:杀掉小怪化一盏魂蜂跟着你走,至多三盏——三盏魂蜂各自两秒自动蜇八点。这篇的核心代码照引擎技能脚本的全规格写:配置表、魂蜂构件、收割表、自动索敌、定时器、调试按钮。
一、效果演示:杀两只,多两盏
演示场里大怪带着两只小怪。普攻先点名小怪:一刀一只,蛛倒的瞬间化出一盏魂蜂飘到你的轨道上——头顶"魂蜂+1"。两盏魂蜂各自两秒一刺、一刺八点地自动索敌蜇击大怪。点「引魂!」:所有魂蜂同时出刀——齐射一轮十六点。演示里试两种路线:先杀光小怪攒满三盏再打大怪,和一只不杀直接打大怪——两种打法的效率差就是魂蜂的价值。
fx-soulbee
二、底层原理:一张收割表加一套自动索敌
模块的账本是一张收割表。小怪的死亡钩子往表里压一盏魂蜂:至多三盏、满了再杀是白给——白给的提示要直说。魂蜂各自带两秒的出手计时,出手时对大怪劈一口八点——魂蜂的索敌独立于玩家的目标:玩家打蛛,魂蜂劈大怪,两线的输出互不占拍。引魂是收割表的扳机——把所有魂火的出手计时清零,下一拍齐射。
魂蜂的索敌为什么锁定大怪而不是玩家的目标?锁定玩家目标的版本,玩家切目标魂蜂就跟着转火——三盏魂蜂跟着玩家的指针乱飘,输出像是替玩家挂机;锁定大怪的版本,魂蜂有自己的"脾气",玩家打小怪它劈大怪,两线输出的画面感就是收割美学的核心。引魂齐射是唯一让魂蜂听话的瞬间——三盏同时出手的整齐感,玩家会为了这一帧多杀三只小怪。收割的乐趣从来不在蜇击本身,而在"我的每一杀都变成了看得见的战力"这条因果链上。
三、核心代码:完整模块(上·骨架)
-- @file SoulBee.lua
-- 魂蜂 —— 击杀化魂蜂,魂蜂自动索敌蜇击
local SoulBee = {}
local CONST = {
WISP_CAP = 3,
WISP_GAP = 2.0,
WISP_DMG = 8,
ORBIT_R = 46,
COLOR_WISP = "#8fd4f0",
COLOR_DEEP = "#1f4f8f",
COLOR_GHOST = "#d8f0ff",
ZORDER_WISP = 133,
ZORDER_FX = 135,
AUTOINC_BASE = 983000,
}
local _wisps = {}
local _cdLeft = 0
local _sysT = 0
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "SB",
CONST.AUTOINC_BASE + _autoInc)
end
local function GetActorPos(id)
if not id then return nil end
local x = SL:GetValue("ACTOR_POSITION_X", id)
local y = SL:GetValue("ACTOR_POSITION_Y", id)
if not x or not y then return nil end
return { x = x, y = y }
end
local function SafeRemove(node)
if node and not GUI:Widget_IsNull(node) then
GUI:removeFromParent(node)
end
end
local function ShowTip(msg)
if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end
local function CreateWispNode()
local node = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Wisp"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(node, CONST.ZORDER_WISP)
for i = 1, 10 do
local a1 = (i - 1) / 10 * 6.28
local a2 = i / 10 * 6.28
GUI:DrawLine_Create(node, string.format("w_%d", i), 0, 0, 2,
m_cos(a1) * 10, m_sin(a1) * 10,
m_cos(a2) * 10, m_sin(a2) * 10,
CONST.COLOR_WISP, 190)
end
return node
end
四、核心代码:完整模块(下·定时器与索敌开火)
-- 收割钩子与索敌开火
local function Wisp_Spawn()
if #_wisps >= CONST.WISP_CAP then
ShowTip("三盏满了——这一杀白给")
return
end
local node = CreateWispNode()
table.insert(_wisps, { node = node, fireT = 1.0,
seed = #_wisps * 2.1 })
SL:TipAboveMe("魂蜂+" .. #_wisps)
end
local function Wisp_Fire(w, mp, tid, tp)
SL:ActorHurt(tid, CONST.WISP_DMG)
SL:TipAbove(tid, "-" .. CONST.WISP_DMG)
SL:PlayWispBolt(mp.x, mp.y, tp.x, tp.y)
end
function SoulBee.CallAll()
for i = 1, #_wisps do
_wisps[i].fireT = 0
end
if #_wisps > 0 then
ShowTip(#_wisps .. "盏魂蜂齐蜇——"
.. (#_wisps * CONST.WISP_DMG) .. "点一轮")
end
end
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_sysT = _sysT + dt
local mp = GetActorPos(SL:GetValue("USER_ID"))
if not mp then return end
local tid = SL:GetValue("MARK_TARGET_ID")
local tp = tid and GetActorPos(tid)
for i = 1, #_wisps do
local w = _wisps[i]
local a = _sysT * 1.6 + w.seed
local wx = mp.x + m_cos(a) * CONST.ORBIT_R
local wy = mp.y - 56 + m_sin(a * 1.3) * 20
SL:MoveNode(w.node, wx, wy)
if not tp then
w.fireT = math.min(w.fireT, 0.4)
else
w.fireT = w.fireT - dt
if w.fireT <= 0 then
w.fireT = CONST.WISP_GAP
Wisp_Fire(w, mp, tid, tp)
end
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
ShowTip("技能已加载: 魂蜂 (调试按钮触发)")
end, 1.0)
return SoulBee
五、机制问答:三个高频追问
问:玩家死亡魂蜂还在吗?
答:散——魂蜂是跟人的,人倒了魂火就地熄灭,复活从零攒,这是收割流派的死亡惩罚,也是它平衡的支点。
问:魂蜂蜇死的怪算谁的?
答:算玩家的——击杀判定跟着伤害来源走,魂蜂的蜇击记在玩家账上,收割的回响一环扣一环。
问:三盏魂蜂的出手会同时吗?
答:不会——每盏的计时种子错开了零点几秒,三盏轮流出手画面上像蜂群轮咬,引魂才是齐射的唯一开关。
问:魂蜂的轨道会重叠吗?
答:不会——每盏的轨道种子带相位差,三盏转起来像蜂窝的三个眼,重叠的版本看起来像一只蜂在抖,相位差就是视觉的账。
六、调参指南与商业服怎么用
调参三笔账。三盏封顶对两秒一蜇八点是满魂蜂的被动产值每秒十二——贴着玩家普攻产值的八成走,魂蜂是副刀不是主刀。收割上限三盏对一只小怪的场面意味着有杀必满——想让玩家珍惜每一杀的版本把上限压到二。引魂齐射是把被动转主动的扳机——齐射后所有盏从零计时,齐射的代价是两秒的火力真空。常见坑三个:小怪的死因不查魂蜂被毒死的也算玩家收割;玩家死亡魂蜂不散,复活后带着上一世的魂火;魂火的轨道节点不随玩家瞬移更新,传送后魂蜂从半场外飘过来。
第四笔是收割的判定容差:小怪残血十点以内才算可收割——容差太大魂蜂满得没有门槛,太小玩家总差一刀,十点是补一刀就赚的心跳线。
商业服里魂蜂是"收割美学"的门面:魂蜂的颜色按赛季换——春樱、夏萤、秋枫,收割的每一杀都带着当季的限定色。副本里它是清怪效率的放大器——三盏魂蜂齐蜇的清场效率把小怪关的通关时间砍半。变体做成魂蜂进化:魂蜂蜇够次数后升阶——一阶八点二秒、二阶十二点一点五秒、三阶十六点一秒——进化树从数值长到了节奏。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
运营落地还有两笔:一段是收割排行榜——按魂蜂累计蜇击数排名,收割玩法的荣誉感要有一个专门的榜,混在总输出榜里就埋没了;一段是魂蜂的音效分层——一盏一只音、两盏双声部、三盏和弦,听觉上的"攒满了"比头顶数字更让玩家上头。
另外新手期送一盏体验魂蜂——先尝到收割的甜头,玩家自然会去练收割的手法。
写完留一句给做收割系的同学:魂蜂卖的是"每一杀都有回响"——身后飘着的三盏魂蜂,是把击杀清单挂在了玩家腰间。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 排查一个报错走到深夜:玩家申诉"人物瞬移",录像里人也确实是凭空跳了半张地图——坐标链上多出来一次没有来由的写…
【游戏功能】 后山出过一单笑话:一个远程怪卡在断桥那头射了全队十分钟,走不过去、勾不着、弹道够不到——最后是位玩钩子的老哥一…
【游戏功能】 M.at = M.at 2 —— 就这一行,让一只盯了三天的速攻怪从"碰不得"变成"随便打"。怪的可怕从来不在…
【游戏功能】 为什么连着打同一个怪,一刀会比一刀疼?叠劲的答案是:劲是攒出来的——起手八点,每接一刀加四点,叠到六层刀刀二十…
【游戏功能】 群里报过一个怪现象:同一位玩家打同一个怪,有时一刀十三有时一刀十,面板攻击力没变过——排查了半天才发现,十三的…
【游戏功能】 线上出过一单事故:同战力两个人对砍,先手的那位反而输了——事后翻账才发现,赢家的每一刀都比面板数值高出一截,高…