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

截魂:它死后魂要飞回石像,半路截下就断重生

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

【游戏功能】

打死它为什么它又站起来了?截魂揭开底牌:这怪死后魂不散——一缕魂从尸体里飘出来,两秒半飞回右侧的石像,魂到石像的瞬间它满血还魂、原地再战。想在它身上刻"永久死亡"四个字,只有两条路:半路把魂射下来,或者用魂钉把魂拖慢到射得着。这篇把整套模块拆开:配置表、魂体构件、截魂判定、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:魂飞石像,半路截下

演示场把怪打死:尸体倒地的同一瞬,一缕紫魂从尸体里升起来,拖着一道尾光朝右侧的石像飞——头顶挂着"魂·射它"的提示。这两秒半是全场的决胜局:箭追上魂,一箭穿魂——紫光炸开,"截魂成功",它再也不会站起来了;手慢了,魂钻进石像——"还魂!"它满血蹦出来,这一趟白打。点「魂钉!」:一枚魂钉钉进魂体,魂的飞行慢下一半——慢下来的魂就是活靶,两支箭稳稳收走。演示里试两种打法:什么都不做硬吃它的还魂,和魂钉加连射的截魂流——前者永远打不死,后者一劳永逸。截魂玩的是死后那两秒:杀死它只是上半场,截下魂才算终审。

demo
 fx-soulcut

二、底层原理:一缕飞行魂体加一次还魂判定

模块的机关是一对搭档。飞行魂体:怪死亡的同一帧,魂体从尸体坐标起飞——航向石像、航速恒定、滞空两秒半,魂体是有碰撞盒的实体,玩家的弹道认它。还魂判定:魂体抵达石像的那一帧,本体的死亡撤销、血量回满、原地复活;魂体在半路被击碎,还魂链当场断裂,这怪从此是真死。和复活保护那些时长的分野在"还魂有实体中介":常规复活是倒计时到点自动站起,截魂的还魂要靠一缕魂实体飞完全程——飞的那两秒半,就是玩家所有反制的落点。

魂为什么要飞回石像而不是原地飘?飞回石像给了反制一个空间上的靶——原地飘的魂只能拼手速,有航线的魂可以卡位、可以预瞄、可以用魂钉拖——空间给了打法的纵深。

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

lua
-- @file SoulCut.lua
-- 截魂 —— 它死后魂要飞回石像还魂,半路截下就断重生

local SoulCut = {}

local CONST = {
    SOUL_FLIGHT   = 2.5,
    SOUL_SPEED    = 90,
    STONE_X       = 600,
    PIERCE_CD     = 3.0,
    SLOW_LIFE     = 2.0,
    SLOW_RATE     = 0.5,

    COLOR_SOUL    = "#9080d8",
    COLOR_DEEP    = "#2e2060",
    COLOR_GHOST   = "#d0c8f4",

    ZORDER_SOUL   = 136,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1029000,
}

local _soul      = nil
local _deadID    = 0
local _cdLeft    = 0
local _soulFx    = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "SLC",
        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 ReleaseSoul(tid)
    local tp = GetActorPos(tid)
    if not tp then return end
    _soul = { x = tp.x, y = tp.y - 80, t = 0,
        slow = 0 }
    SL:SpawnSoulWisp(tid)
    SL:TipAbove(tp.x, "出魂!")
    ShowTip("它的魂出来了——两秒半飞到石像就还魂,射它")
end

local function ReachStone()
    SL:ReviveActor(_deadID)
    SL:PlayReviveFullFx(_deadID)
    SL:TipAbove(_deadID, "还魂!")
    ShowTip("魂归石像——它还魂了,满血再战")
    SafeRemove(_soulFx)
    _soulFx = nil
    _soul = nil
end

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

lua
-- 死亡钩子:放魂
SL:RegisterLUAEvent(LUA_EVENT_ACTOR_DEATH, "SLC_Soul", function(tid)
    _deadID = tid
    ReleaseSoul(tid)
end)

-- 截魂结算:魂体被击碎,还魂链断
SL:RegisterLUAEvent(LUA_EVENT_SOUL_HIT, "SLC_Cut", function()
    if not _soul then return end
    SL:PlaySoulShatterFx(_soul.x, _soul.y)
    SL:ScreenShake(3, 0.2)
    SafeRemove(_soulFx)
    _soulFx = nil
    _soul = nil
    ShowTip("截魂成功——魂碎了,它再也回不来了")
end)

-- 魂钉:拖慢魂体
function SoulCut.Pin()
    if _cdLeft > 0 then
        ShowTip("钉在磨——" .. string.format("%.1f", _cdLeft) .. "秒")
        return
    end
    if not _soul then
        ShowTip("没有魂在飞——先送它走一趟")
        return
    end
    _cdLeft = CONST.PIERCE_CD
    _soul.slow = CONST.SLOW_LIFE
    SL:PlaySoulPinFx(_soul.x, _soul.y)
    SL:TipAbove(_soul.x, "魂钉!")
    ShowTip("魂钉入体——它的魂飞慢了一半,射它!")
end

-- 定时器:魂体飞行与石像判定
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if not _soul then return end
        _soul.t = _soul.t + dt
        local rate = _soul.slow > 0
            and CONST.SLOW_RATE or 1.0
        _soul.x = _soul.x + CONST.SOUL_SPEED * rate * dt
        _soul.y = _soul.y - 14 * rate * dt
        if _soul.slow > 0 then _soul.slow = _soul.slow - dt end
        if _soul.x >= CONST.STONE_X - 16 then
            ReachStone()
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("魂钉", function()
        SoulCut.Pin()
    end)
    ShowTip("技能已加载: 截魂 (调试按钮触发)")
end, 1.0)

function SoulCut.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SafeRemove(_soulFx)
    _soul = nil
end

return SoulCut

五、机制问答

问:魂体对玩家的伤害弹反吗?
答:不——魂是纯靶子不还手,射魂的窗口只有飞行时间没有对抗,难度全在预瞄不在对拼。

问:魂被射碎后怪还能复活吗?
答:彻底不能——魂是还魂的唯一中介,魂碎链断,这一次的死亡就是终审,尸体上再无挂碍。

问:魂钉对已经减速的魂叠加吗?
答:不叠——一枚钉只挂一层慢,重复钉只续时长,负面的账也要有上限。

问:石像被拆了魂飞哪儿?
答:魂就地消散——石像是还魂的锚,拆锚等于免打赢在开局,这也是拆石像先于杀怪的道理。

问:多只怪一起死魂会排队吗?
答:会——石像一次收一缕,后到的魂悬在半空等位,等位的魂也是靶子,人多的时候截魂能截成串。

问:魂钉能钉住还魂后的怪吗?

答:不能——钉只认飞行的魂,还了魂的怪归怪管,魂钉的名单上只有魂这一种靶子。

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

第四笔是航程的长度:两秒半飞九十步是"能预瞄、来得及"的窗口——航程太短魂一闪就没,太长玩家都转完一圈了魂还在路上。第三笔是魂钉的深浅:慢一半对两秒是"两箭的余裕"——钉太深魂变静止靶,钉太浅等于没钉。第二笔是还魂的满血:满血再战是这机制的狠处——还魂半血的版本玩家干脆不截魂等第二遍,满血的版本每一遍还魂都是实打实的重打。第一笔是魂的观感:魂体半透明、拖着尾光、头顶挂"射它"——魂要有魂的样子,实心模样的魂玩家下不去手。常见坑三个:魂体飞行穿地形,穿墙的魂射不着;还魂的满血漏了护盾和异常清理,还魂归来一身旧病;截魂成功后石像的光效不灭,石像一直亮着像还有下一缕。

商业服里截魂是"猎魂人流派"的终审手艺:杀一次不算杀,截了魂才算——商城里魂钉的样式做成品级,木钉、银钉、缚魂钉,钉进魂体的那一声轻响就是猎魂人的判词。运营落地还有两笔:一段是石像教学——教一句"先看场上有没有石像",流派的第一眼看的不是怪;一段是截魂榜——按累计截断的还魂次数排名,魂飞得最远断得最狠的人有碑。变体做成连环魂:石像还魂三次后碎裂——三魂三还,石像碎的那一帧才是真正的终审。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

猎魂人的规矩再念一遍:眼要跟着魂走,手要比魂快。

写完留一句给做死亡系的同学:截魂卖的是"杀死它只是上半场"——那缕拖着尾光飞向石像的紫魂,是把死亡本身变成第二个战场的判词。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

撩拨:撩它三下它就上头,一头撞进坑里

【游戏功能】 火气 = 火气 + 1 —— 每撩一下涨一格的火,三格烧满它就上头:一头冲过来,收不住脚,穿过你的位置一头扎进…

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

抛砖:一块砖砸出个破绽,接住就是双倍

【游戏功能】 它接招的那一秒,就是你的那一秒。抛砖把这句拳谚做成了机制:一块砖头砸过去,它本能抬手格挡——格挡的一秒二里,招…

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

瞭望:扑了它的灯,警戒圈缩一半

【游戏功能】 为什么偷袭总被提前发现?因为它的瞭望灯亮着——二百二十步的警戒圈画在暗处,你一踏进去它就开始上弦。瞭望换个思路…

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

爆桶:油桶就在它脚边,一箭的事

【游戏功能】 桶存活着 = 否 —— 一箭点掉一只桶,爆的却是怪的血条:油桶就摆在它脚边,三十点的爆炸不分敌我地溅——溅不溅…

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

交班:双岗交班那一秒,谁都不设防

【游戏功能】 交班计时 = 1.0 —— 交班的那一秒,两个岗哨都在行礼:手离开刀,眼离开敌,全身的门都开着。交班把这一秒做…

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

挪桩:挪一根路标,把它遛进你算好的道

【游戏功能】 巡逻道 = { 左桩, 右桩 } —— 巡逻道就是这两根桩之间的一条线:桩在哪,道就在哪;道在哪,它就一辈子走…

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