CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

双斧轮:一掷一补,斧斧不断

2026-09-29 05:34 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【游戏功能】

测试服抛过一个怪报错:attempt to compare number with nil,掷第三把斧的时候必现。翻代码,掷斧的判定写的是"如果冷却没转完就返回",可充能系统里根本没有"冷却"这个字段——有人把单冷却技能的判定模板粘过来,字段名没改,第三把斧去读一个不存在的字段,当场翻车。修这个报错的过程,正好把双斧轮这套充能系统从头到尾捋了一遍。

一、两把斧、两条回、不断档

单冷却技能的节奏是"一刀、干等、再一刀":八秒冷却里玩家有六秒在发呆,输出曲线是一根根孤零零的柱子。双斧轮换了一种资源观:身上挂着两把飞斧,掷出去的斧各回各的三秒——掷一把,另一把还在手里;手里那把掷完,第一把已经回来半程。输出曲线从柱子变成连绵的浪,只要交替着掷,斧斧不断档。看懂这套的关键是抛弃"技能冷却"的老观念:充能系统的表上没有一条总冷却,只有两个独立的槽位,每个槽位自己记自己的回充进度——那个 compare number with nil 的报错,根子就是把"读总冷却"的习惯带进了"读槽位"的系统里。槽位的可视也按这个逻辑画:两格小斧标挂在人物身侧,满的亮橙色斧头,掷空的画一条回充小横条,百分比推进,回满的一瞬橙光一闪加一声"斧回"的飘字——玩家不看说明也能数出手里有几把斧、下一把什么时候回来。

斧子的飞行也带戏:出手是一记侧身甩腕,斧面在空中自转着飞出去,命中的瞬间橙白火花炸开——飞斧的自转不是装饰,它是"这件东西是死的"的证明,直线飞行的飞刀像法术,翻着跟头的斧头才像扔出去的铁器。狼怪挨斧会趔趄 0.22 秒,但步子不停——它一路挨着斧头往玩家脸上凑,玩家的掷斧窗口就在这一步步逼近里被压缩,节奏压力全靠它的脚程给。掷空的反馈也要单独调教:两把斧都在回的时候按按钮,灰字"斧都没回"加一声闷响,按钮不灰、不惩罚、不锁死——空按是信息不是罪过,玩家试一下就知道该等谁。

完整演示在这——点「掷斧!」连着掷,盯住两格斧标怎么轮:

demo
 fx-charge2

二、幂尔框架实现:槽位表与回充 tick

幂尔框架里充能技能不再走 SetCD 那条线,走的是槽位表加回充 tick:

lua
local Axes = {}
local SLOTS, RECHARGE = 2, 3

local slots = {}

function Axes.Init()
    for i = 1, SLOTS do
        slots[i] = { full = true, t = 0 }
    end
end

function Axes.Count()
    local n = 0
    for i = 1, #slots do
        if slots[i].full then n = n + 1 end
    end
    return n
end

function Axes.Throw(target)
    local idx = 0
    for i = 1, #slots do
        if slots[i].full then idx = i; break end   -- 取第一个满槽
    end
    if idx == 0 then
        SL:ShowTipAbove("player", "斧都没回")
        return
    end
    slots[idx].full = false
    slots[idx].t = 0
    SL:PlayActorAct("player", "attack")
    SL:FlyProjectile("hand_axe", "player_hand", target, 0.24, function()
        SL:Damage(target, 18)
        SL:PopNumber(target, 18, "orange")
        SL:Stagger(target, 0.22)
    end)
end

local function onTick(dt)
    for i = 1, #slots do
        local s = slots[i]
        if not s.full then
            s.t = s.t + dt
            SL:SetSlotFill(i, s.t / RECHARGE)      -- 回充条: 可视推进
            if s.t >= RECHARGE then
                s.full = true
                SL:FlashSlot(i)
                SL:ShowTipAbove("player", "斧回")
            end
        end
    end
end

SL:RegTick("axe_tick", onTick)
SL:RegClick("throw", Axes.Throw)

return Axes

读槽永远遍历、取第一个满的,不存在"当前第几把"的游标——游标是单冷却思路的残留,两把斧谁先回满谁先用,顺序无关紧要,省掉的游标就是省掉的 nil。

调用方式上再记三点:Init 建槽是显式的,别用赋值懒初始化——那个 compare number with nil 的报错,就是槽位表没建全、读到了空位;SetSlotFill 每帧写 UI 值,内部自己做了去抖,数值没变不重绘,八个槽同时转也不掉帧;回充不走一次性的定时回调而走 tick 累加,是因为要给 UI 喂进度——一次性回调只有"完成"没有"过程",回充条就成了黑的一条。

三、回充时长的配比与空槽的手感

三秒回充配 0.24 秒的弹道,意味着双斧齐掷的最坏情况里,玩家等两秒出头必有斧回——这个"永远有盼头"是充能手感的命。回充改到五秒,浪就断了档,手感退化成两个错开的单冷却;改到一秒半,斧变成无限弹药,资源管理名存实亡。三秒不是算出来的最优,是试出来的"断档感消失"的临界。空槽那一瞬的手感也要兜住:两把全空时按掷斧,飘一个灰字"斧都没回",配一小声闷响——空按要有反馈,但不能有惩罚,扣血扣蓝都是把资源系统做成罚款系统。往上叠一层就是进阶玩法:三槽斧、五槽箭,回充时长逐槽递增,玩家开始规划"先掷便宜的再掷贵的"。最后一条纪律:充能和冷却不共存,一个技能要么走槽位要么走冷却,两个系统缝在一个技能上,UI 要画两套进度,玩家的脑子要记两本账,怎么算都是亏。

多角色共用的充能池是另一个要提前想清的题:两把斧是"这个技能"的槽位还是"这个角色"的槽位?规范写死槽位跟技能走,一技能两槽、二技能三槽各转各的——合到一个角色池里,切技能时槽位归属扯不清,回充进度要不要共享又是一笔烂账。最后是 UI 的分寸:槽位图标贴着人物走还是钉在屏幕角落?演示里贴在人物身侧,是因为掷斧的节奏快,眼睛不能离开战场——快节奏技能的状态永远跟着人画,慢节奏的才配进状态栏,这个分位值得每个技能单独想一遍——UI 跟人走还是跟屏走,本身就是手感的一部分。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

影锁:影锁绑你绑它,锁期拼刀

【游戏功能】 控制技能的镜像问题是:锁住了怪,自己是不是也闲着?影锁把这道两难摆上台面:影锁四秒,它动不了、你也动不了——它…

2026-10-01 10:00 996 技术组
进阶实战游戏功能

震魂:震魂入体叠加出招自损

【游戏功能】 打断为什么只有"清读条"一种?震魂偏要反过来——不清招、不断势,打在它读条半途的那一劲顺着招震进腑——中劲十秒…

2026-10-01 10:00 996 技术组
进阶实战游戏功能

蜂王:喂小怪蜂王进化,三阶蜂王蜇翻全场

【游戏功能】 蜂群为什么总是一只一只出?蜂王偏要让它们进化:放一只蜂王出来,杀掉小怪喂它——喂三只升一阶,三阶蜂王的毒刺一秒…

2026-10-01 10:00 996 技术组
进阶实战游戏功能

血刃:每刀扣血换吸血,血刀双刃

【游戏功能】 技能为什么总是不扣自己的血?血刃偏要反着来:开着血刃的每一刀先扣自己二血、命中回三血——净赚一但要打得中,空刀…

2026-10-01 10:00 996 技术组
进阶实战游戏功能

破军旗:旗立三秒圈内加攻,旗倒攻散

【游戏功能】 bn.t = bn.t - dt ——一行旗面倒计时的代码,撑起了破军旗全部的紧迫感:旗立三秒、圈内加攻三成,…

2026-10-01 10:00 996 技术组
进阶实战游戏功能

淬毒刃:淬毒三刀叠一层,一层毒过一秒六

【游戏功能】 淬毒为什么要一毒到底?淬毒刃偏要一层一层叠:一刀淬一层毒、毒层一秒六地烂,六层封顶之后一刀下去毒伤三十六——叠…

2026-10-01 10:00 996 技术组