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

酸雨:酸雨落下来,站在里面持续掉血

2026-10-01 18:51 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【游戏功能】

酸雨为什么总是被当成可有可无的点缀技能?酸雨给了答案:不是雨不强,是没有逼它站进来。酸雨的区域不是洒在你脚下的——是洒在怪的脚下的,你不走进去它就一直淋。这篇把整套模块拆开:配置表、酸雨区域、持续结算、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:酸雨落下来,站在里面持续掉血

演示场点「酸雨!」:一片青绿色的酸雨区在怪的脚下亮起——区域持续六秒,怪在里面每零点五秒掉六点。你的刀在圈外补伤害,怪血条一格格往下磨。演示里试两笔账:怪站里面六秒被酸磨三十六点,和怪跑出雨区后你追着打——站在雨里比追着打省一半的刀。酸雨教的是区域控制:引它站进来,雨替你打。

demo
 fx-acidrain

二、底层原理:一片酸雨区域加一次持续结算

模块的机关是一对搭档。酸雨区域:按钮落术的那一帧在怪的坐标画一片椭圆区域——区域定在落点不跟怪走,区域内每零点五秒结算一次持续伤害。持续结算:区域内每跳扣六点——伤害走独立结算不受减伤影响,酸是酸,腐蚀性强。和毒那类持续伤害的分野在"酸雨是区域不是状态":毒挂在怪身上走到哪毒到哪,酸雨留在地面站进去才掉血——一个跟着人走,一个钉在原地等人来。

区域为什么定在落点不跟怪走?跟怪走的版本怪只要站着不动就一直掉血,酸雨变成了自动挂机加伤;定在落点的版本玩家要把怪引进区域才有收益,引怪的走位课就是这套机制的核心。

三、核心代码:完整模块(上·骨架)

lua
-- @file AcidRain.lua
-- 酸雨 —— 酸雨落下来站在里面持续掉血

local AcidRain = {}

local CONST = {
    RAIN_LIFE     = 6.0,
    RAIN_TICK     = 0.5,
    RAIN_DMG      = 6,
    RAIN_RADIUS   = 80,
    RAIN_CD       = 5.0,

    COLOR_RAIN    = "#78b868",
    COLOR_DEEP    = "#1e4a28",
    COLOR_GHOST   = "#c8ecd0",

    ZORDER_RAIN   = 128,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1066000,
}

local _rainT     = 0
local _rainX     = 0
local _tickT     = 0
local _cdLeft    = 0
local _rainFx    = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "ADN",
        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 RainTick(tid)
    local tp = GetActorPos(tid)
    if not tp then return end
    if math.abs(tp.x - _rainX) <= CONST.RAIN_RADIUS then
        SL:ActorHurt(tid, CONST.RAIN_DMG)
        SL:TipAbove(tid, "酸-6")
        SL:PlayAcidTickFx(tid)
    end
end

function AcidRain.Cast()
    if _cdLeft > 0 or _rainT > 0 then return end
    local tid = SL:GetValue("MARK_TARGET_ID")
    local tp = GetActorPos(tid)
    if not tid or not tp then return end
    _cdLeft = CONST.RAIN_CD
    _rainT = CONST.RAIN_LIFE
    _rainX = tp.x
    SafeRemove(_rainFx)
    _rainFx = GUI:Layout_Create(GUI:Attach_SceneF(),
        GenID("Rain"), _rainX, tp.y, 0, 0, false)
    GUI:setLocalZOrder(_rainFx, CONST.ZORDER_RAIN)
    SL:PlayRainStartFx(_rainX)
    SL:TipAbove(tid, "酸雨!")
    ShowTip("酸雨落了——六秒的雨区,站里面掉血")
end

四、核心代码:完整模块(下·定时器与持续结算)

lua
-- 定时器:雨期倒计时与持续结算
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _rainT > 0 then
            _rainT = _rainT - dt
            _tickT = _tickT + dt
            if _rainFx then
                GUI:setPosition(_rainFx, _rainX,
                    GetActorPos(SL:GetValue("MARK_TARGET_ID"))
                    and select(2, GetActorPos(
                        SL:GetValue("MARK_TARGET_ID"))) or 0)
            end
            if _tickT >= CONST.RAIN_TICK then
                _tickT = 0
                local tid = SL:GetValue("MARK_TARGET_ID")
                if tid and not SL:GetValue("ACTOR_DEAD", tid) then
                    RainTick(tid)
                end
            end
            if _rainT <= 0 then
                SafeRemove(_rainFx)
                _rainFx = nil
                ShowTip("雨停了——酸雨区域消散")
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("酸雨", function()
        AcidRain.Cast()
    end)
    ShowTip("技能已加载: 酸雨 (调试按钮触发)")
end, 1.0)

function AcidRain.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SafeRemove(_rainFx)
    _rainT = 0
    _tickT = 0
end

return AcidRain

五、机制问答

问:酸雨对玩家自身有效吗?
答:有效——区域认位置不认阵营,玩家走进去也掉血,酸雨面前人人平等。

问:酸雨和中毒叠加吗?
答:叠加——酸雨是区域伤害,中毒是状态伤害,两套独立结算,同时生效就是双重消耗。

问:怪跑出区域后区域还在吗?
答:在——区域六秒固定不动,怪跑出去雨还在下,跑回来又继续掉,区域是公共的陷阱。

问:多片酸雨能叠吗?
答:能但没必要——冷却五秒比区域六秒短,上一片还没散就能落下一片,但两片重叠区域伤害不叠加。

问:酸雨里能用其他技能吗?
答:能——酸雨不管你的手,你的技能在雨里照放,这也是酸雨比控制技顺手的原因:不锁手。

问:酸雨的持续伤害能暴击吗?

答:不能——持续跳是固定值不掷骰,酸雨的账是明账不暗算,每跳六点一跳不落。

问:酸雨能淋到空中单位吗?

答:能——酸雨落的是区域不是高度,跳起来的怪照淋不误,只要它还在区域的横坐标范围内。

六、调参指南与商业服怎么用

第四笔是区域的宽度:八十步的半径对怪的身位是"站进去就出不来"的宽度——区域太窄怪一跨就过,太宽酸雨变成半场毒圈。第三笔是持续间隔的松紧:零点五秒一跳是"肉眼可见的持续掉血"的频率——间隔太短数字刷屏,太长持续伤害没有紧迫感。第二笔是单跳的斤两:六点对一场四十秒的架是最多七十二点的区域总产出——总产出要够覆盖两次平砍才有动力引怪进雨。第一笔是区域的可见:椭圆区域带颜色呼吸——区域的边界一目了然,玩家才知道引到哪里算到位。常见坑三个:区域跟着怪走,区域变成移动炮台;区域的持续伤害吃减伤系数,减伤怪站在雨里不掉血;酸雨的视觉太淡,玩家看不见区域在哪。

商业服里酸雨是"毒师流派"的招牌:别人的技能打一枪换一个地方,他的酸雨钉在地上等人来——商城里雨区的样式做成品级,青苔雨、腐液雨、幽冥雨,那片一明一暗呼吸着的椭圆区域就是毒师的地盘。运营落地还有两笔:一段是引怪教学——教一句"先站它的必经之路再落雨",流派第一课是预判走位;一段是酸雨榜——按区域持续伤害总量排名,最会引的人有碑。变体做成酸雨扩散:区域每五秒向外扩一圈——从一口井到一片湖,酸雨的版图越铺越大。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

毒师的口诀只有一句:它走它的是它的自由,雨落这里是雨的权利。

毒师还有半句压箱的:雨区的中心最好落在怪的退路上——它想跑也得穿雨。

写完留一句给做区域系的同学:酸雨卖的是"站进来就别想白走"——那片青绿色的呼吸区域,是把地面变成武器的第一课。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

走一格为什么是半秒?拆开996引擎走路状态机

接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…

2026-10-03 05:31 996 技术组
进阶实战游戏功能

特效总挂在脚后跟上?挂点表选对一行顶十行

【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

刀刀都判命中,玩家为什么喊挥空?命中表现差的那一拍

【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

怪的皮一会儿绿一会儿红?状态染色的色号表就三列

【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

996引擎Buff系统解剖:中毒变绿、冰冻发白是怎么挂上去的

前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…

2026-10-03 05:25 996 技术组
进阶实战游戏功能

编钟纹:五口钟排着敲,一口更比一口疼

【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…

2026-10-03 05:01 996 技术组