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

Lua受击击退:位移衰减的推离

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

【语法算法】

vel=vel*math.pow(0.01,dt)——先拆这一行。击退的全部手感都在这一行的衰减里:初速三百把怪推出去,速度按秒乘零点零一的幂衰减,边走边衰,几步之后稳稳站住。击退教的是推离:打中不只是掉血,还把怪推离原位——距离是它自己滑出去的,不是瞬移过去的,滑出去的每一步都是这一刀的余威。这篇把整套写法拆开:配置表、初速注入、衰减推进、边界停墙、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:初速推离,边走边衰

演示场怪站在一段平地的右端,左端立着一堵墙。点「击退」:怪带着三百的初速往左滑——滑动的速度一拍一拍变小,走几步就越来越慢,最后稳稳站住,残余速度归零。连点两下:第二下的推力叠在滑动途中,怪再窜一截。要是把它推到墙边,撞墙即停,墙就是它的安全带——安全带系上了,推力再大也只推到墙为止。演示里试两笔账:连推两下的总位移和单推一次的位移——衰减之中叠力,每一推都比上一推短——短有短的道理,衰减不吃白给的力。受击击退教的是推离:位移要自己滑出来,力道要自己衰干净。

mermaid
flowchart TD
A[命中注入初速] --> B[位置加速度乘时长]
B --> C[速度乘衰减系数]
C --> D{速度低于阈值}
D -- 是 --> E[速度归零 站定]
D -- 否 --> F{撞到墙}
F -- 是 --> E
F -- 否 --> B
E --> A
demo
 fx-knockback

二、底层原理:一次初速注入加一阶位移衰减

模块的机关是一对搭档。初速注入:命中的那一拍给怪发一笔速度——方向是击退的方向,大小定滑多远,这一笔是推离的全部动力——推的方向就是打出来的方向,写死不了。位移衰减:速度每一拍乘衰减系数——初速三百衰减到个位数只要零点几秒,滑行由快转慢,怪是自己滑停的,不是被人按住的——自己停下来的位移才有分量,被人摆到位的位移只是换了个坐标。和瞬移类位移的分野在"击退的位移有过程":瞬移是从 A 到 B 没有中间态,击退是初速带出一整段越来越慢的滑行——滑行的过程就是打击感的后半段。

衰减为什么选幂函数不用匀减?匀减的滑停是匀减速直线运动,收势生硬;幂衰减先快后慢,推出去那一瞬间最狠,收势渐渐温柔——打击感的狠和稳全在这条衰减曲线上。

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

lua
-- @file KnockBack.lua
-- 受击击退 —— 位移衰减的推离

local KnockBack = {}

local CONST = {
    KNOCK_SPEED   = 320,
    DECAY_POW     = 0.01,
    STOP_SPEED    = 6,
    WALL_X        = 90,

    AUTOINC_BASE  = 1157000,
}

local _x         = 480
local _vel       = 0
local _scheduler = nil
local _autoInc   = 0

local function ShowTip(msg)
    if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end

local function ApplyPos()
    SL:SetPosition(SL:GetValue("MARK_TARGET_ID"),
        math.floor(_x))
end

function KnockBack.Vel()
    return _vel
end

function KnockBack.Reset(x)
    _x = x
    _vel = 0
    ApplyPos()
end

四、核心代码:完整模块(下·初速注入与衰减推进)

lua
-- 衰减推进:滑行、衰减、撞墙三件事一拍做完
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        if _vel == 0 then return end
        _x = _x + _vel * dt
        _vel = _vel * math.pow(CONST.DECAY_POW, dt)
        if math.abs(_vel) < CONST.STOP_SPEED then
            _vel = 0
        end
        if _x <= CONST.WALL_X then
            _x = CONST.WALL_X
            _vel = 0
            ShowTip("撞墙了——墙是它的安全带")
        end
        ApplyPos()
    end, 0.02)
end

-- 初速注入:命中那一拍发一笔推力
function KnockBack.Push(direction)
    if direction == nil then direction = -1 end
    _vel = CONST.KNOCK_SPEED * direction
    ShowTip("推走了——速度边走边衰")
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("击退", function()
        KnockBack.Push(-1)
    end)
    ShowTip("技能已加载: 受击击退 (调试按钮触发)")
end, 1.0)

function KnockBack.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    _vel = 0
end

return KnockBack

五、机制问答

问:击退中途再被推一下会怎样?
答:叠速——第二笔初速加在残余速度上,滑行续一段,连推的距离比单推远但不是翻倍,衰减一直在分账。

问:推到墙边撞墙会掉血吗?
答:不掉——撞墙只是停,撞墙伤害是另一个机制的事,击退只管推和停,不多管一步。

问:大体型的头目推得动吗?
答:推不动——击退的推力有体重校验,头目的吨位直接免疫推离,说明栏写明"大体型免推"。

问:击退的方向永远朝墙吗?
答:朝来力的反方向——推的方向由出手的位置定,从背后出手就往前推,方向是打出来的不是写死的——打出来的方向才带着这一刀的脾气。

问:残余速度小到六为什么直接归零?
答:省账——每帧零点几步的滑行肉眼看不见,继续算只是白耗拍子,阈值归零是收笔。

六、调参与实战怎么用

第四笔是衰减的根:零点零一的幂衰减是"两三步站定"的收势——衰减太慢怪滑出半张地图,太快推力像瞬移,这一行的系数是整套手感的心跳。第三笔是初速的份量:三百二的初速对九十步的墙距是"推得远但推不到墙"的份额——初速太大一推到墙变成撞墙玩法,太小推力形同点头,份额要拿最窄的战场校过。第二笔是撞墙的收法:撞墙即停是边界的礼节——穿墙的版本击退变成传送,撞墙弹回的版本是另一套弹球机制,停就是停。第一笔是推力的方向:方向由出手的反方向定——方向写死的版本从背后偷袭反而把怪推向深方,方向永远是打出来的。常见坑三个:击退没有体重校验推走了头目;衰减按帧算的帧率依赖旧账;撞墙停了速度没清导致原地嗡嗡振。

实战里击退是打击反馈三件头的位移担当:顿帧管节奏、闪白管确认、击退管位移,三件一起上才有"这一刀很重"的立体感。组里的约定是:击退一律带衰减不瞬移——过程感就是打击感,这条约定写进组规第一条,谁瞬移谁请全组喝奶茶——奶茶虽小,规矩事大。这篇的模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做位移系的同学:受击击退卖的是"被推出去的那段滑行"——那一段边走边衰的位移和撞墙时的一声停,是把伤害数字变成空间一记推离的一份动力。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

Lua自动炮台:架一个自动索敌开火

【语法算法】 上一版的炮台索敌逻辑有个隐蔽报错:炮台永远打同一个怪——即使那只怪已经死了,索敌的游标也不挪窝。追到底索敌的游…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua元素转换:火伤转冰伤附带减速

【语法算法】 先抛一个坑:打不完的火系怪怎么办?火抗怪火打不动,换冰系技能要切装备要换面板——切完黄花菜都凉了。元素转换的答…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua连锁引燃:一个着火引燃下一个

【语法算法】 上个月的事故复盘会上有个数字被念了三遍:四成——策划写的是"同伴陪疼四成",代码落下去成了"陪疼四十点",两只…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua弹射地垫:踩上去弹飞到空中

【语法算法】 单行代码拆解:弹射初速=-420——弹射的全部动力就这一行的负初速。负号朝上、四百二十是弹射的初速大小——踩上…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua时间减缓:流速减半的局部时差

【语法算法】 上一版的减速类模块全按"乘以零点五"来写,帧率无关的版本照搬了这套写法——结果高帧率机上减速效果好,低帧率机上…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua引力球:丢出去把怪吸过来

【语法算法】 先抛一个坑:怎么把散在四处的怪聚到一起打?逐个拉是笨办法,一个范围技又只能打一片——引力球的答案是一个会动的吸…

2026-10-02 04:50 996 技术组