【游戏功能】
打死它为什么它又站起来了?截魂揭开底牌:这怪死后魂不散——一缕魂从尸体里飘出来,两秒半飞回右侧的石像,魂到石像的瞬间它满血还魂、原地再战。想在它身上刻"永久死亡"四个字,只有两条路:半路把魂射下来,或者用魂钉把魂拖慢到射得着。这篇把整套模块拆开:配置表、魂体构件、截魂判定、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:魂飞石像,半路截下
演示场把怪打死:尸体倒地的同一瞬,一缕紫魂从尸体里升起来,拖着一道尾光朝右侧的石像飞——头顶挂着"魂·射它"的提示。这两秒半是全场的决胜局:箭追上魂,一箭穿魂——紫光炸开,"截魂成功",它再也不会站起来了;手慢了,魂钻进石像——"还魂!"它满血蹦出来,这一趟白打。点「魂钉!」:一枚魂钉钉进魂体,魂的飞行慢下一半——慢下来的魂就是活靶,两支箭稳稳收走。演示里试两种打法:什么都不做硬吃它的还魂,和魂钉加连射的截魂流——前者永远打不死,后者一劳永逸。截魂玩的是死后那两秒:杀死它只是上半场,截下魂才算终审。
fx-soulcut
二、底层原理:一缕飞行魂体加一次还魂判定
模块的机关是一对搭档。飞行魂体:怪死亡的同一帧,魂体从尸体坐标起飞——航向石像、航速恒定、滞空两秒半,魂体是有碰撞盒的实体,玩家的弹道认它。还魂判定:魂体抵达石像的那一帧,本体的死亡撤销、血量回满、原地复活;魂体在半路被击碎,还魂链当场断裂,这怪从此是真死。和复活保护那些时长的分野在"还魂有实体中介":常规复活是倒计时到点自动站起,截魂的还魂要靠一缕魂实体飞完全程——飞的那两秒半,就是玩家所有反制的落点。
魂为什么要飞回石像而不是原地飘?飞回石像给了反制一个空间上的靶——原地飘的魂只能拼手速,有航线的魂可以卡位、可以预瞄、可以用魂钉拖——空间给了打法的纵深。
三、核心代码:完整模块(上·骨架)
-- @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
四、核心代码:完整模块(下·定时器与截魂结算)
-- 死亡钩子:放魂
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 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 火气 = 火气 + 1 —— 每撩一下涨一格的火,三格烧满它就上头:一头冲过来,收不住脚,穿过你的位置一头扎进…
【游戏功能】 它接招的那一秒,就是你的那一秒。抛砖把这句拳谚做成了机制:一块砖头砸过去,它本能抬手格挡——格挡的一秒二里,招…
【游戏功能】 为什么偷袭总被提前发现?因为它的瞭望灯亮着——二百二十步的警戒圈画在暗处,你一踏进去它就开始上弦。瞭望换个思路…
【游戏功能】 桶存活着 = 否 —— 一箭点掉一只桶,爆的却是怪的血条:油桶就摆在它脚边,三十点的爆炸不分敌我地溅——溅不溅…
【游戏功能】 交班计时 = 1.0 —— 交班的那一秒,两个岗哨都在行礼:手离开刀,眼离开敌,全身的门都开着。交班把这一秒做…
【游戏功能】 巡逻道 = { 左桩, 右桩 } —— 巡逻道就是这两根桩之间的一条线:桩在哪,道就在哪;道在哪,它就一辈子走…