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

虚空步:消失后出现在它身后

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

【游戏功能】

P.x = M.x + 60 —— 就这一行,虚空步的全部机关:消失一步,出现在它身后六十步的位置。这篇把整套模块拆开:配置表、虚空构件、传送结算、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:消失一步,出现在它身后

演示场点「虚空步!」:玩家原地化为一阵青紫色的雾——同一帧,雾在怪的身后六十步处重新凝聚——你已经站在它背后了。背刺一刀二十,比正面平砍翻倍。演示里试两种用法:出现在它背后输出一轮再走,和消失后在原地等它转身——前者的背刺二十是最优解,后者的原地等待是浪费虚空步的冷却。虚空步教的是位置:打架打得好的核心不是刀快,是站得对。

demo
 fx-voidstep

二、底层原理:一段虚空传送加一次背刺结算

模块的机关是一对搭档。虚空传送:按钮落术的那一帧,玩家坐标从当前位置跳到怪的身后六十步——传送是瞬间的,没有弹道没有延迟,消失和出现是同一帧。背刺结算:出现在怪身后的第一刀吃背刺加成翻倍——不是因为虚空步加了伤害,是因为你站到了它身后。和闪现那类纯位移的分野在"虚空步的目标是怪的身后不是任意方向":闪现随便往哪闪,虚空步永远闪到怪的背面——锁定了结果的方向性,才有了背刺的必然性。

传送为什么固定六十步?六十步是近战射程之内、怪的攻击范围之外的黄金距离——太近贴脸挨爪,太远背刺够不着,六十步刚好是你出刀它够不着的绝对安全区。

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

lua
-- @file VoidStep.lua
-- 虚空步 —— 消失后出现在它身后

local VoidStep = {}

local CONST = {
    STEP_DIST     = 60,
    STEP_CD       = 5.0,
    BACKSTAB_DMG  = 20,

    COLOR_VOID    = "#6878c8",
    COLOR_DEEP    = "#1a1a52",
    COLOR_GHOST   = "#c8d0f4",

    ZORDER_VOID   = 134,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1069000,
}

local _cdLeft    = 0
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "VDS",
        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 ShowTip(msg)
    if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end

function VoidStep.Step()
    if _cdLeft > 0 then
        ShowTip("虚空冷却——" .. string.format("%.1f", _cdLeft) .. "秒")
        return
    end
    _cdLeft = CONST.STEP_CD
    local myID = SL:GetValue("USER_ID")
    local tid = SL:GetValue("MARK_TARGET_ID")
    local mp = GetActorPos(myID)
    local tp = GetActorPos(tid)
    if not mp or not tp then return end
    local side = mp.x < tp.x and -1 or 1
    SL:SetActorPos(myID, tp.x + side * CONST.STEP_DIST, tp.y)
    SL:PlayVoidStepFx(mp.x, mp.y, tp.x + side * CONST.STEP_DIST, tp.y)
    SL:TipAboveMe("虚空步")
    ShowTip("虚空一步——出现在它身后")
end

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

lua
-- 背刺结算:虚空步后的第一刀翻倍
SL:RegisterLUAEvent(LUA_EVENT_MELEE_HIT, "VDS_Back", function(tid)
    if _backstab then
        _backstab = false
        return CONST.BACKSTAB_DMG
            - (SL:GetValue("HIT_DAMAGE", tid) or 10)
    end
    return 0
end)

-- 定时器:冷却推进
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("虚空步", function()
        VoidStep.Step()
    end)
    ShowTip("技能已加载: 虚空步 (调试按钮触发)")
end, 1.0)

function VoidStep.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    _cdLeft = 0
    _backstab = false
end

return VoidStep

五、机制问答

问:虚空步能对空中目标使用吗?
答:能——虚空步传送的是位置不是攻击,只要目标有坐标就能传到它身后,至于打不打得到另说。

问:传送后怪会立刻转身吗?
答:会——怪的朝向每帧更新,但转身需要一拍动画,这一拍就是背刺的时机。

问:虚空步能连续使用吗?
答:看冷却——五秒冷却就是五秒,连续传送的版本虚空步变成永久闪现,没有冷却的位移技不叫位移技叫飞行。

问:传送后原来的位置有残留吗?
答:有——原地留一阵青紫色的虚空雾,雾的消散时间就是"你来过"的痕迹,也是给对面的心理暗示。

问:虚空步和闪现的区别在哪?
答:闪现是自由的,虚空步是有目标的——闪现随便往哪走,虚空步永远去怪的身后,锁定目标等于锁定方向。

问:虚空步后的背刺和普攻能连吗?

答:能——背刺是独立结算的一次额外伤害,后面的普攻照常出,背刺不占普攻的节奏拍。

问:虚空步能追着逃跑的怪用吗?

答:能——虚空步传的是目标身后不看跑没跑,逃跑的怪照样传到它身后,追击也是虚空步的用法。

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

第四笔是距离的档位:六十步是"近战够得着、怪的爪子够不着"的黄金距离——距离太近背刺变贴脸互殴,太远背刺的刀够不到目标。第三笔是背刺的档位:二十点对十点平砍是正好的双倍——翻倍以上虚空步变成主力输出,翻倍以下背刺不如平砍。第二笔是冷却的手感:五秒对一场四十秒的架是八次传送——冷却太短虚空步变成无限位移,太长一场架只能用一两次。第一笔是传送的视觉:原地雾散和落地凝聚要在同一帧完成——传送的"瞬间感"全靠两帧的无缝切换,有任何延迟就不是虚空步是慢动作。常见坑三个:传送的目标坐标没有做地形校验,传送进墙里;背刺加成没设触发窗口,传送后过五秒再打还翻倍;传送后朝向没有自动面向目标,背刺的刀从正面砍。

商业服里虚空步是"暗影刺客流派"的看家步:别人走近路他走虚空——商城里传送特效做成品级,青雾、紫雾、暗影雾,消失和出现的那两帧就是暗影刺客的签名。运营落地还有两笔:一段是背刺教学——教一句"传到背后再出刀",流派第一课是站位的含义;一段是虚空榜——按虚空步后的背刺总伤排名,传得最准的人有碑。变体做成连锁虚空步:传送后五秒内再按一次传回原地——来回去之间的路线画出一场虚空舞。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

暗影刺客的信条就一句:背面比正面安全。

暗影刺客还有半句压箱的:虚空步的六十步不是安全距离是最佳射程。

写完留一句给做位移系的同学:虚空步卖的是"换个位置就是换个世界"——那阵原地散开的青紫雾和背后六十步的新站位,是把位置本身变成伤害倍率的传送术。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

别再全局变量满天飞:996引擎消息通知机制入门

评审二开代码的时候,我看到最多的坏味道不是写错,是"穿墙":怪物死亡的函数里直接调 UI 刷新,UI 按钮回调里直接改怪物状…

2026-10-03 06:06 996 技术组
进阶实战游戏功能

别再全局变量满天飞:996引擎消息通知机制入门

评审二开代码的时候,我看到最多的坏味道不是写错,是"穿墙":怪物死亡的函数里直接调 UI 刷新,UI 按钮回调里直接改怪物状…

2026-10-03 05:55 996 技术组
进阶实战游戏功能

别再全局变量满天飞:996引擎消息通知机制入门

评审二开代码的时候,我看到最多的坏味道不是写错,是"穿墙":怪物死亡的函数里直接调 UI 刷新,UI 按钮回调里直接改怪物状…

2026-10-03 05:52 996 技术组
进阶实战游戏功能

别再全局变量满天飞:996引擎消息通知机制入门

评审二开代码的时候,我看到最多的坏味道不是写错,是"穿墙":怪物死亡的函数里直接调 UI 刷新,UI 按钮回调里直接改怪物状…

2026-10-03 05:51 996 技术组
进阶实战游戏功能

背包一卡卡三年:GUIQuickCell懒加载列表救了你

做排行榜、背包、邮件列表的兄弟,迟早会遇到同一张工单:"列表一打开掉帧,滑动像幻灯片"。99% 的原因是把一千行数据老老实实…

2026-10-03 05:46 996 技术组
进阶实战游戏功能

i2、C32、i8s都是什么鬼?996引擎网络协议类型系统速查

新接手 996 引擎客户端的人,打开 network/networkUtil.lua 看到满屏的 i1 、 I4 、 C32…

2026-10-03 05:40 996 技术组