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

地葬:把它整个按进土里,出土还懵半天

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

【游戏功能】

把一只活怪按进土里是什么体验?地葬的答案分两段:按下去的两秒它整个没入土中,拳脚全废、眼界全无;弹出来的那一下还要再懵零点八秒——头顶转星星,方向都找不着。这篇把整套模块拆开:配置表、地葬构件、沉浮结算、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:按进土里,出土懵半天

演示场的怪贴身缠斗。点「地葬!」:一记土黄的掌印拍在怪的天灵盖上——它整个人被按进地里,地上只剩一圈塌陷的土印和两秒的倒计时。土里的两秒它什么都做不了:不出手、不走位、连朝向都定住。倒计时归零,土层"噗"地弹开——它灰头土脸地钻出来,先吃十二点的出土伤,再头顶转星星懵零点八秒——这两秒二的时间差,就是从按下去到缓过来的全部账目。演示里试两种接法:出土的懵期里贴脸输出,和趁它埋着先拉开身位——地葬给的是两秒白送的时间,怎么花看安排。地葬不讲道理:天下武功再快,埋进土里也是一招都使不出。

demo
 fx-burial

二、底层原理:一段沉浮动画加一份出土懵判

模块的机关是一对搭档。沉浮结算:按下去的那一帧怪挂"入土"状态——模型整体下沉九十步只留土印,行动链、攻击链、转向链全部冻结,两秒后土层弹开原路浮出。出土懵判:浮出的瞬间追加十二点闷伤和零点八秒的懵态——懵态是出土伤的后续不是独立控制,土里闷的那口气总要缓一缓。和眩晕定身的分野在"沉下去":眩晕是原地发呆,定身是脚下生根,地葬是把人整个收进地形里——画面上少一个人,战斗里少一个对手,两秒的干净是任何站立控制都比不了的。

入土为什么连朝向都冻住?出土还认旧的朝向,玩家的走位预判才有意义——埋进去朝哪、出来还朝哪,两秒的布局全建立在它出不来也转不了身的前提上。

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

lua
-- @file Burial.lua
-- 地葬 —— 把它整个按进土里,出土还懵半天

local Burial = {}

local CONST = {
    SINK_LIFE     = 2.0,
    SINK_CD       = 6.0,
    SINK_DEPTH    = 90,
    BURST_DMG     = 12,
    DIZZY_LIFE    = 0.8,

    COLOR_BURIAL  = "#a08050",
    COLOR_DEEP    = "#4a3418",
    COLOR_GHOST   = "#e8d8b0",

    ZORDER_HOLE   = 128,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1008000,
}

local _sinkT     = 0
local _sinkID    = 0
local _cdLeft    = 0
local _holeFx    = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "BRL",
        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 CreateHoleFx(x, y)
    local node = GUI:Layout_Create(GUI:Attach_SceneF(),
        GenID("Hole"), x, y, 0, 0, false)
    GUI:setLocalZOrder(node, CONST.ZORDER_HOLE)
    GUI:DrawEllipse_Create(node, "pit", 0, -2, 30, 8,
        CONST.COLOR_DEEP, 240)
    return node
end

function Burial.Cast()
    if _cdLeft > 0 or _sinkT > 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.SINK_CD
    _sinkT = CONST.SINK_LIFE
    _sinkID = tid
    SL:FreezeActorAll(tid, CONST.SINK_LIFE)
    SafeRemove(_holeFx)
    _holeFx = CreateHoleFx(tp.x, tp.y)
    SL:PlaySinkFx(tid, CONST.SINK_DEPTH)
    SL:TipAbove(tid, "葬!")
    SL:ScreenShake(3, 0.2)
    ShowTip("按进土里了——两秒闷一记,出土还懵")
end

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

lua
-- 出土结算:闷伤加懵态
local function SurfaceUp()
    local tp = GetActorPos(_sinkID)
    SL:PlaySurfaceFx(_sinkID)
    if tp then
        SL:ActorHurt(_sinkID, CONST.BURST_DMG)
        SL:TipAbove(_sinkID, "-12")
        SL:StunActor(_sinkID, CONST.DIZZY_LIFE)
        SL:ScreenShake(3, 0.2)
        ShowTip("出土了——先吃十二点,再懵零点八秒")
    end
    SafeRemove(_holeFx)
    _holeFx = nil
end

-- 定时器:土里的倒计时
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _sinkT > 0 then
            _sinkT = _sinkT - dt
            if _sinkT <= 0
                or SL:GetValue("ACTOR_DEAD", _sinkID) then
                _sinkT = 0
                if not SL:GetValue("ACTOR_DEAD", _sinkID) then
                    SurfaceUp()
                else
                    SafeRemove(_holeFx)
                    _holeFx = nil
                end
            end
        end
    end, 0.02)
end

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

function Burial.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    if _sinkT > 0 then
        SL:ThawActorAll(_sinkID)
        SafeRemove(_holeFx)
    end
    _sinkT = 0
end

return Burial

五、机制问答

问:大体型的怪埋得进去吗?
答:埋不进去——体重超限的头目只吃半秒踉跄不入土,地葬对块头的克制和铁掌同一条规矩,说明栏写明白。

问:土里的怪挨打吗?
答:挨——入土只封它的行动不封你的刀,两秒里想怎么输出就怎么输出,土印就是靶心。

问:出土的懵能被解控解掉吗?
答:能——懵态走控制链,净化一解就醒,地葬的两秒二里只有埋着的两秒是铁账,懵是送的甜头。

问:埋着的时候怪的增益还走表吗?
答:不走——入土冻结一切计时,狂意的表、灼心的账全部停摆,地葬顺带是全游戏的暂停键,这一点要写进图鉴。

问:能把怪埋进水里吗?
答:地形校验驳回——水面不收活口,落点自动挪回最近的开地,埋进水里的怪再钻出来就成了水鬼。

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

第四笔是埋期的深度:两秒对怪的出手周期两点秒是"至少白吃一拍"的保底——埋三秒的版本控场太满,一秒半的版本玩家刚转身它就出来了。第三笔是出土伤的分量:十二点是"闷的一口气"不是第二发技能——出土伤太重地葬成了伤害技,太轻弹出的那一帧没有仪式感。第二笔是懵期的长短:零点八秒是"转个身贴上去"的余裕——懵一秒以上地葬变两段硬控,零点五秒以下甜头尝不着。第一笔是土印的实在感:塌陷的土印要有阴影、出土要有土块崩落——埋和出的两段土戏是这套机制的全部画面,土戏偷工,葬就不像葬。常见坑三个:入土的怪免疫了范围技的判定,土印成了无敌点;出土浮空的坐标没校验,弹出来卡进模型堆;切场景时埋着的怪没浮出,地图上留一个永久土印。

商业服里地葬是"土行流派"的压箱手:天下武功再快,埋进土里也使不出——商城里土印的样式做成品级,土印、石印、琉璃印,地上那圈塌下去的印子就是土行玩家的手笔。运营落地还有两笔:一段是缠斗怪图鉴——哪种怪贴身烦人写进页脚,地葬专治各种缠功;一段是闷杀榜——按埋着期间打出的总伤排名,两秒里的输出讲究全在规划。变体做成连葬:出土懵期里再按一次能把怪重新埋回去——二段葬的连招把两秒拉成四秒,手快的人独享。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做控制系的同学:地葬卖的是"请你入土"——那圈塌下去的土印和零点八秒的星星,是对一切花活最朴素的回答:先埋了再说。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

赊账:这一刀双倍先赊着,三秒后连本带息还

【游戏功能】 先消费后还款这事儿,战场上也行得通?赊账的答案是行得通,但有利息:点一下赊账,下一刀双倍——多出来的那十点伤害…

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

全垒:把小怪挑上天,一记扣杀双倍入账

【游戏功能】 为什么棒球里全垒打最值钱?因为球在天上的那一秒,全场的眼睛都仰着头。全垒把这份仰头搬进了打架:一记挑空把小怪送…

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

迟箭:把它的箭慢放成蜗牛,箭雨里都能散步

【游戏功能】 后台埋点抓到一个怪数据:某位玩家的承伤记录里,被远程命中数是零——不是躲得快,是他挨的每一箭都"消失了"。翻录…

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

借刀:站到它队友身后,借它自己的刀劈它

【游戏功能】 P.x, C.x = C.x, P.x —— 一行换位,借刀的全部机关就藏在这一笔里:玩家和小怪换个位置,怪的…

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

搬兵:抓一只小的抡起来,砸得大的直哆嗦

【游戏功能】 打群架的最高境界是什么?是一个人打,让对面自己人打自己人。搬兵把这句话演成了动作:抓住一只小怪举过头顶,抡圆了…

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

越战:开战越久劲越足,三十秒练出一口气

【游戏功能】 同样的装备,为什么老玩家打得越来越疼?新手第一刀十点,第一百刀还是十点;老玩家第一刀十点,第一百刀已经十四——…

2026-10-01 12:59 996 技术组