【游戏功能】
打群架的最高境界是什么?是一个人打,让对面自己人打自己人。搬兵把这句话演成了动作:抓住一只小怪举过头顶,抡圆了砸向大怪——三十点实锤,小的垫背,大的掉皮。这篇把整套模块拆开:配置表、搬兵构件、抛掷结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:抓小的,砸大的
演示场一只大怪带一只小怪。普攻先别急着砍小的——点「搬兵!」:玩家一个箭步把小怪拎起来举过头顶,小怪在半空乱蹬,头顶挂出"弹药在手"。再点一次按钮:玩家抡圆了把它掷出去——小怪划一道弧线砸在大怪脑门上,大的吃三十点实锤,小的当场垫背。演示里试两条路线:先抓后砸一气呵成,和舍不得小的慢慢磨——搬兵的两段动作,伤害顶得上五刀平砍,还省一趟追大怪的脚程。搬兵改写的是怪物列表的意义:场上每一只小的,都是一件现成的投掷武器。
fx-mobilize
二、底层原理:一段举持状态加一次抛掷结算
模块的机关是一对搭档。举持状态:点按钮的第一段把目标小怪挂进"被举持"状态——小怪的行为、攻击、受击全部冻结,坐标跟着玩家的头顶走,举持不限时长,弹药可以攥着挑时机。抛掷结算:第二段按钮把举持的小怪沿抛物线掷向大怪——落点那一帧大怪吃三十点、小怪按跌落伤清零,一石二鸟,账走两边。和搬尸爆炸那些尸体利用的分野在"活体投掷":尸爆烧的是倒下的库存,搬兵抡的是还喘气的现役——抓举的瞬间小怪就退出了战斗序列,场上的敌人变成了手里的武器。
抛掷为什么必中不校验闪避?抡出去的活体是盲盒不是指令——必中的三十点是搬兵全套动作的定价,中途被打断抡空了才是这套技能的风险,定价要给足才有人愿意扛着一只怪满场跑。
三、核心代码:完整模块(上·骨架)
-- @file Mobilize.lua
-- 搬兵 —— 抓一只小的抡起来,砸得大的直哆嗦
local Mobilize = {}
local CONST = {
THROW_DMG = 30,
THROW_TIME = 0.7,
THROW_ARC = 90,
MOBILIZE_CD = 4.0,
COLOR_THROW = "#c07850",
COLOR_DEEP = "#4e2812",
COLOR_GHOST = "#f0c8a8",
ZORDER_HELD = 134,
ZORDER_FX = 135,
AUTOINC_BASE = 1011000,
}
local _heldID = 0
local _throwT = 0
local _throwFrom = 0
local _throwTo = 0
local _cdLeft = 0
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "MBZ",
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 PickUp()
local tid = SL:GetValue("MARK_SMALL_ID")
if not tid or SL:GetValue("ACTOR_DEAD", tid) then
ShowTip("兵没了——这场的搬兵用完了")
return
end
_heldID = tid
SL:FreezeActorAll(tid, 999)
SL:HoldActorOverHead(SL:GetValue("USER_ID"), tid)
SL:PlayGrabFx(tid)
ShowTip("抓起来了——举过头顶,再点一下抡出去")
end
local function ReleaseThrow()
local bigID = SL:GetValue("MARK_TARGET_ID")
local tp = GetActorPos(bigID)
if not tp then
ShowTip("大的不在——砸了个空")
return
end
SL:ActorHurt(bigID, CONST.THROW_DMG)
SL:TipAbove(bigID, "-30")
SL:PlaySmashFx(bigID)
SL:ScreenShake(3.4, 0.22)
SL:ActorHurt(_heldID, 999)
ShowTip("砸实了——三十点,小的也垫了背")
end
四、核心代码:完整模块(下·定时器与抛掷推进)
-- 抛掷入口:二段式按钮
function Mobilize.Act()
if _cdLeft > 0 then
ShowTip("手还在抡——" .. string.format("%.1f", _cdLeft) .. "秒")
return
end
if _throwT > 0 then return end
if _heldID ~= 0 then
_cdLeft = CONST.MOBILIZE_CD
local mp = GetActorPos(SL:GetValue("USER_ID"))
local bigID = SL:GetValue("MARK_TARGET_ID")
local tp = bigID and GetActorPos(bigID)
if not mp or not tp then return end
_throwFrom = mp.x + 30
_throwTo = tp.x
_throwT = CONST.THROW_TIME
SL:ThrowActorArc(_heldID, _throwTo,
CONST.THROW_ARC, CONST.THROW_TIME)
SL:PlaySwingFx(SL:GetValue("USER_ID"))
ShowTip("抡出去了——小的当炮弹,大的接实锤")
else
PickUp()
end
end
-- 定时器:抛掷推进与落点结算
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _throwT > 0 then
_throwT = _throwT - dt
if _throwT <= 0 then
_throwT = 0
ReleaseThrow()
_heldID = 0
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("搬兵", function()
Mobilize.Act()
end)
ShowTip("技能已加载: 搬兵 (调试按钮触发)")
end, 1.0)
function Mobilize.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
if _heldID ~= 0 then SL:ThawActorAll(_heldID) end
_heldID = 0
end
return Mobilize
五、机制问答
问:举着的时候小怪还打人吗?
答:不打——举持冻结行为,它在你头顶蹬腿只是演出,腿蹬得再欢也是死物一件。
问:举着的时候玩家被控了怎么办?
答:弹药掉地——被击飞打落的举持当场解除,小怪落回原位继续打你,扛着弹药走位就要背弹药的风险。
问:能举两只叠着砸吗?
答:不能——一手一只,第二只要等第一只出手,容量的账逼着玩家抓准了再抡。
问:砸歪了有补偿吗?
答:没有——抛掷必中大怪,不存在砸歪,要担心的只有举着被控和空场没大的,风险写在明处。
问:举持的小怪算嘲讽目标吗?
答:不算——它已退出战斗序列,大的不会为救它掉头,冷血的商业逻辑写进行为表就是这几行。
问:搬兵能搬头目吗?
答:搬不动——体重超限的头目举不起来,搬兵的名单只写小怪,大力士也要讲基本法。
六、调参指南与商业服怎么用
第四笔是实锤的分量:三十点对五刀平砍是"一段动作吃两段收益"的定价——实锤太轻没人愿意举着怪跑全场,太重大怪战变成搬砖模拟器。第三笔是抛物线的弧度:九十步的弧高是"看得清起落"的演出高度——弧太低像平移,太高像升天,九十步刚好是抡圆了的视觉记忆。第二笔是两段的节奏:抓举和抛掷之间不限时长——攥弹药的从容是这套技能的味道,限时的版本变成抢答游戏。第一笔是举持的观感:小怪在头顶要蹬腿挣扎——挣扎得越欢,投掷的喜剧感越足,搬兵的爽一半来自这一口荒诞。常见坑三个:举持的小怪被范围技打死,手里攥着尸体;抛掷途中大怪移动,落点不追;被控掉弹后冷却照走,白按一次还吃一口奶不到的亏。
商业服里搬兵是"摔跤手流派"的看家绝活:把怪物名单当武器库逛——商城里举持的握法做成品级,夹颈、扛肩、单手拎,抡出去那道弧线就是摔跤手的台标。运营落地还有两笔:一段是组怪教学——教一句"小的别急着杀,留着当炮弹",流派的门槛从念头开始;一段是重炮榜——按单次抛掷的总伤排名,抡得最圆的人有据可查。变体做成连珠搬兵:抛出的小怪落点弹起再砸一次——一抛两响,弹坑里开出连锁的花。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
再记一笔搬兵的体己话:举着怪走路的时候别横冲直撞,弹药摔了不赔。
写完留一句给做场景利用系的同学:搬兵卖的是"敌人就是弹药"——那只举过头顶乱蹬的小怪,是对怪物列表最不客气的一次改写。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 香烧着的时候,人心最定。焚香把这句老话做成了机制:点一炷八秒的香,香烧着的三刀一叩首——每叩一回,血回六点。香…
【游戏功能】 下一封战书是什么概念?是你和它同时签下"六秒内往死里打"的字据:你加三,它加四——它的刀更疼,你的刀也不再客气…
【游戏功能】 日志里躺着一条没人在意的细节:某只头目的治疗明细里,回血来源写着一颗珠子的名字——两颗珠子轮流替它回血,每两秒…
【游戏功能】 oil = oil - 1 —— 灯芯上两秒烧掉的一滴油,就是挑灯的全部家底:灯亮着,刀足十;油见底,刀软成五…
【游戏功能】 守塔组出过一单静悄悄的失误:同一批怪,同样的守塔人,有的晚上一血没掉,有的被摸了三回——查录像才发现,守得住的…
【游戏功能】 为什么有些玩家越打越软?前二十刀刀刀十点,二十刀之后刀刀四点——装备没变,变的是气。匀气把这件事做成了明账:五…