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

牵线:一根线拴俩,跑远了一起挨拽

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

【游戏功能】

拽出去,绷到头,双双回弹——牵线的账目就三步:金线拴住两只怪,你把一只拖远,线绷直的那一瞬两只一起回弹,各挨十点再撞个满怀。这篇把整套模块拆开:配置表、金线构件、绷直判定、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:一根线拴俩,跑远了一起挨拽

演示场两只小怪之间拴着一根金线,线的松紧看得一清二楚。点「扯线!」:抓住离你近的那只往远处拖——两怪的距离拉开,金线从松弛到绷直。绷到头的那一瞬:"绷-十"两边同蹦——线像皮筋一样把它们弹回一堆,撞在一起再各吃六点。松了再拽,绷了再弹——一对小怪被你的一根线遛得团团转。演示里看两处:线的松紧画得诚实,绷直的瞬间那一下震屏。牵线玩的是弹弓:你拉开的是它们之间的距离,弹回来的是它们的血条。

demo
 fx-tetheryank

二、底层原理:一条金线构件加一次绷直回弹

模块的机关是一对搭档。金线构件:两只怪之间拴一根限长一百二十步的金线——线不伤人,只记账:两怪的实际距离一旦超过限长,线就绷直。绷直回弹:绷直的那一帧,两怪被各自拽回限长线段的两端——回弹各挨十点,撞在一处再各贴六点。和拖拽那类强制位移的分野在"拽的是距离不是位置":拖拽把怪拖到指定点,牵线只负责把超标的距离弹回去——玩家拽多远都行,弹回来多疼由线的脾气定。

回弹为什么连撞的那六点也要算?撞的那六点是"合拢"的奖励——只弹不撞的版本两怪弹回原位各回各家,撞一下才有"被线收拢成一堆"的画面,收拢了才好一网打尽。

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

lua
-- @file TetherYank.lua
-- 牵线 —— 一根线拴俩,跑远了一起挨拽

local TetherYank = {}

local CONST = {
    TETHER_LEN    = 120,
    SNAP_DMG      = 10,
    CLASH_DMG     = 6,
    SNAP_GAP      = 0.8,
    YANK_CD       = 2.5,
    YANK_DRAG     = 140,

    COLOR_TETHER  = "#b8a030",
    COLOR_DEEP    = "#4e3e10",
    COLOR_GHOST   = "#f0e0a8",

    ZORDER_TETHER = 129,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1051000,
}

local _pair       = {}
local _gapT       = 0
local _cdLeft     = 0
local _tetherFx   = nil
local _scheduler  = nil
local _autoInc    = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "TYK",
        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 SnapBack()
    local a = _pair[1]
    local b = _pair[2]
    local mid = (GetActorPos(a).x + GetActorPos(b).x) / 2
    SL:SetActorPos(a, mid - 60, GetActorPos(a).y)
    SL:SetActorPos(b, mid + 60, GetActorPos(b).y)
    SL:ActorHurt(a, CONST.SNAP_DMG)
    SL:ActorHurt(b, CONST.SNAP_DMG)
    SL:TipAbove(a, "绷-10")
    SL:TipAbove(b, "绷-10")
    SL:PlaySnapFx(mid)
    SL:ScreenShake(2.8, 0.18)
    ShowTip("线绷到头——双双回弹各挨十")
end

四、核心代码:完整模块(下·定时器与绷直判定)

lua
-- 扯线入口:拖远一只
function TetherYank.Yank()
    if _cdLeft > 0 then
        ShowTip("线在收——" .. string.format("%.1f", _cdLeft) .. "秒")
        return
    end
    local tid = SL:GetValue("MARK_SMALL_ID")
    if not tid then
        ShowTip("没活口——扯不动")
        return
    end
    _cdLeft = CONST.YANK_CD
    local tp = GetActorPos(tid)
    local dir = tp and 1 or -1
    SL:DragActorAway(tid, dir * CONST.YANK_DRAG, 0.4)
    ShowTip("拽出去了——线绷到头有它好看的")
end

-- 定时器:绷直判定与回弹
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        if #_pair < 2 then return end
        local a = _pair[1]
        local b = _pair[2]
        if SL:GetValue("ACTOR_DEAD", a)
            or SL:GetValue("ACTOR_DEAD", b) then return end
        local ap = GetActorPos(a)
        local bp = GetActorPos(b)
        if not ap or not bp then return end
        local gap = math.abs(bp.x - ap.x)
        if gap > CONST.TETHER_LEN and _gapT <= 0 then
            _gapT = CONST.SNAP_GAP
            SnapBack()
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    local a, b = SL:GetSmallPair()
    _pair = { a, b }
    SL:BindDebugButton("扯线", function()
        TetherYank.Yank()
    end)
    ShowTip("技能已加载: 牵线 (调试按钮触发)")
end, 1.0)

function TetherYank.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    _pair = {}
end

return TetherYank

五、机制问答

问:线能拴头目吗?
答:拴不住——体重超限的头目把线绷断,牵线的名单只有小怪,说明栏写明白"小型单位可拴"。

问:回弹的方向认什么?
答:认两怪连线——各自朝对方弹,弹完相距还是限长,线收拢两只的几何永远对称。

问:绷直的瞬间能再拽吗?
答:能——拽的冷却两秒,绷直的回弹不进冷却,手快的玩家能把回弹接进下一轮拉扯。

问:一只死了另一只线还拴着吗?
答:线散——线认两只的活口,单只的线没有张力,散线的幸存者恢复自由身。

问:两怪距离没超也拽得动吗?
答:拽得动——拽是拉开距离的动作,线只管"超了弹",拽不拽、往哪拽,主动权全在玩家手里。

问:线绷直时能上控制吗?

答:能——绷直回弹和眩晕分两笔账,先弹后晕的怪晕在弹回的位置,控制接得准就是双份。

问:牵线和连痛能一起用吗?

答:天作之合——线把两只弹成一堆,连痛把两只拴成一体,弹完的六点再陪三成,一套连招两本账。

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

第四笔是限长的松紧:一百二十步是"拽两下就绷"的线长——限长太短一拽就弹像拨浪鼓,太长玩家拖半天没反应,一百二十刚好是"两下到位"的手感。第三笔是回弹的账:各十点对三百血的小怪是"弹两轮加相撞就见底"的狠度——回弹太轻牵线成了逗它们玩,太重两根线清一场架。第二笔是相撞的添头:撞一下六点是"收拢成堆"的奖励——没有这一撞,弹回的两怪各回各家,一网打尽的路就断了。第一笔是线的松紧画:松弛的线下坠、绷直的线发亮——线的形态就是距离的读数,玩家的眼睛始终在线上不在面板上。常见坑三个:回弹把两怪弹进同一个模型格,卡成一团;绷直判定漏了对角距离,斜着跑出界不弹;死一只后另一只被幽灵线拽着走。

商业服里牵线是"线师流派"的家什:别人的技能拴在自己身上,他的线拴在两只怪之间——商城里金线的材质做成品级,麻线、金线、缚魂线,那根一绷一弹的金线就是线师的木偶戏。运营落地还有两笔:一段是拉扯教学——教一句"拽远一只,等线绷直",流派第一课是拉不是打;一段是牵线榜——按绷直回弹的总伤排名,线拉得最讲究的人有碑。变体做成三线牵:三只怪两两牵线结成三角——拉一只三只全颤,线师的戏台越搭越大。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

线师的老话:拽的是怪,弹的是血。

线师还有半句压箱的:拽完别贪,等线弹完再拽下一把。

写完留一句给做束缚系的同学:牵线卖的是"距离就是它的把柄"——那根一紧一弹的金线,是把两只怪的相对位置变成伤害来源的一根提线。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

磁引:四秒磁点,它的箭全拐进这点碎掉

【游戏功能】 磁点一开,它的箭全拐——四秒里它射出的每一支箭都拐向同一个聚点,到了聚点整支碎掉,一支都够不着你。磁引把"躲箭…

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

钟摆:半场一摆,谁站线上谁挨砸

【游戏功能】 半场一摆两秒一趟的钟摆,砸中站线上的一切——包括被你引过去的怪。钟摆把"地形"变成了武器:它本身不认敌我,你引…

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

铰击:两键同按,铰它一下二十

【游戏功能】 两键同按零点一五秒内——铰击:两把刃铰在一起砸它二十,外加半秒的僵。单按一键只有十点白给。这篇把整套模块拆开:…

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

三环扣:三角链死一伤二,连环清场

【游戏功能】 三只怪三角连着链:死一只,另外两只各挨十五;链上再倒一只,最后那只又挨十五——三环扣把"清怪"变成了"连环",…

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

蓄盾爆:按住攒盾,盾值就是弹量

【游戏功能】 按住攒盾,盾值就是弹量,松手引爆贴脸的怪——蓄盾爆把"防御"改写成了"蓄弹药":盾攒得越厚炸得越疼,攒盾的两秒…

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

三键诀:劈刺扫按对了顺序,一记四十

【游戏功能】 按对 劈→刺→扫 三键,一记四十;按错一环,只值八点平砍。三键诀把连招的顺序做成了考卷:三枚键摆在你面前,顺序…

2026-10-01 16:31 996 技术组