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

霜棘:冰棘绕身,碰你的都冻一步

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

【游戏功能】

冰系控制为什么总在怪的身上?霜棘偏要长在玩家的身上——冰棘绕你八秒,它近身攻击就冻零点八加六点冻伤,但冰棘不认人:你近身它也冻。这篇的核心代码照引擎技能脚本的全规格写:配置表、冰棘构件、互冻状态机、定时器、调试按钮。

一、效果演示:一圈冰棘,两根晕条

演示场点「霜棘!」:八根冰棘从玩家脚下长出绕成一圈。大怪冲上来抡爪——爪子碰到冰棘的瞬间它自己冻了零点八秒、额外扣六点冻伤。但你抡刀碰它也会触发你自己的冰棘——你也会冻零点八秒。冰棘不认人,两个方向的近身都算"碰"。冰棘不认人,两个方向的近身攻击都算碰了冰棘的棘刺尖。两个方向的近身都算"碰"。冰棘和冰壁垒的交叉也值得做——壁垒挡住怪的路线、冰棘冻住怪的近身,防御系的两件工具一起开就是一面会冻人的墙。演示里先让它来撞你——它冻你看戏;再主动贴脸打它——你冻它看戏。冰棘的公平写在两个晕条的长短差里。

demo
 fx-frostthorn

二、底层原理:一圈冰棘加一对互冻判定

模块的机关是一对镜像。冰棘在身上挂八秒——挂的期间双方的近身攻击都触发冻。互冻的判定写在双方的攻击结算出口:玩家攻击命中时查怪的近身距离,怪攻击命中时查玩家的近身距离——距离在冰棘范围内就触发冻。和反伤的分野:反伤是"你打我你也疼",冻是"你打我你停下来"——疼和停是两种完全不同的惩罚。疼和停是两种完全不同的惩罚。冰棘的公平还有一层深意——它的存在逼着怪的行动做选择:近身攻击会冻、远程攻击打不着,怪的走位怎么选就是怪的智力测试。冰棘的公平写在"不认人"三个字上,这三个字也是冰棘的门槛。冰棘的公平写在"不认人"三个字上,这三个字也是冰棘的门槛。冻的有效也要有视觉——被冻的单位周身亮一层淡青的霜壳,霜壳在冻在、霜壳散了解冻——视觉的冰霜就是冻的倒计时。

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

lua
-- @file FrostThorn.lua
-- 霜棘 —— 冰棘绕身,碰你的都冻一步

local FrostThorn = {}

local CONST = {
    THORN_LIFE   = 8.0,
    THORN_CD     = 9.0,
    STUN_DUR     = 0.8,
    THORN_DMG    = 6,
    THORN_RANGE  = 30,

    COLOR_THORN  = "#8ec8e8",
    COLOR_DEEP   = "#1a4a6e",
    COLOR_GHOST  = "#d8f0fa",

    ZORDER_THORN = 128,
    ZORDER_FX    = 135,
    AUTOINC_BASE = 971000,
}

local _thornT   = 0
local _cdLeft   = 0
local _myStun   = 0
local _foeStun  = 0
local _scheduler = nil
local _autoInc  = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "FTN",
        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

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

lua
-- 冰棘入口
function FrostThorn.Cast()
    if _cdLeft > 0 or _thornT > 0 then return end
    _cdLeft = CONST.THORN_CD
    _thornT = CONST.THORN_LIFE
    ShowTip("冰棘绕了——八秒,它近身就冻")
end

-- 双方攻击出口:冰棘距离判定
local function CheckThorn(attacker, target)
    if _thornT <= 0 then return end
    local ap = GetActorPos(attacker)
    local tpp = GetActorPos(target)
    if not ap or not tpp then return end
    if math.abs(ap.x - tpp.x) <= CONST.THORN_RANGE then
        if attacker == SL:GetValue("USER_ID") then
            _myStun = CONST.STUN_DUR
            SL:ActorHurt(target, CONST.THORN_DMG)
        else
            _foeStun = CONST.STUN_DUR
            SL:ActorHurt(attacker, CONST.THORN_DMG)
        end
    end
end

if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _thornT > 0 then
            _thornT = _thornT - dt
            if _thornT <= 0 then
                ShowTip("棘化了——下一圈跟上")
            end
        end
        if _myStun > 0 then
            _myStun = math.max(0, _myStun - dt)
        end
        if _foeStun > 0 then
            _foeStun = math.max(0, _foeStun - dt)
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    ShowTip("技能已加载: 霜棘 (调试按钮触发)")
end, 1.0)

return FrostThorn

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

调参三笔账。互冻零点八对攻击周期一点二是"冻比打短"的节奏——冻比打长冰棘就变成双停摆,太短冻了跟没冻一样。冰棘八秒对冷却九秒留一秒真空——真空里裸挨,真空越短冰棘越像常驻。冻伤六对冰棘不认人——玩家也冻自己也被扣六,公平的代价写在双方账上。常见坑三个:冰棘只判了怪打玩家漏了玩家打怪;冻的判定没用距离用了碰撞盒,碰撞盒比冰棘大一圈;双方同时冻的帧结算重复扣了冻伤。

商业服里霜棘是"近战反制"的教具:近战职业带棘进组,怪的每一爪都在帮它数拍子——反制的价值从被动长到了主动。攻城战里它是城门守卫的标配——棘绕城墙一圈,冲车的每一次碰撞都在帮守军拖时间。变体做成棘阵升级:冰棘加火棘,冰火交叠的区间既冻又烧——双棘的化学反应从元素长到了地形。变体做成棘阵升级:冰棘加火棘,冰火交叠的区间既冻又烧——双棘的化学反应从元素长到了地形。冰棘的视觉也可以做季节变化——冬天的棘是冰晶、夏天的棘是霜露,视觉的季节感是商业服的加分项。视觉的季节感是商业服的加分项。冰棘和金身的交叉也值得一提——金身开着的时候碰冰棘只冻不扣,金身挡了伤害挡不了冻——防御和控制的互克写在两个技能的交叉判定里。双棘的化学反应从元素长到了地形。冰棘和石肤的交叉也值得一提——石肤开着的时候碰冰棘不冻只扣血,防御系和反制系的交叉就是"有壳不怕冻"的战斗常识。防御系和反制系的交叉就是有壳不怕冻的战斗常识。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做反制系的同学:霜棘卖的是"冰棘不认人"——公平的冰刺比偏袒的盾更能教玩家尊重距离。公平的冰刺比偏袒的盾更能教玩家尊重距离。冰棘的冻还有一层深意——冻不是控制是反制,冻的目的是让怪"近身的成本变高",高到它自己选择远程输出,控场的终极就是让怪自己改打法。公平的冰刺比偏袒的盾更能教玩家尊重距离。冰棘的碰撞判定也要精确——距离三十步以内就算碰、三十步以外就算没碰,判定的精度就是冰棘的公信力。
补一个演示彩蛋位:冰棘消散的那一帧,最后一根冰棘会先化成一滴水再落进地面——水滴的一瞬是冰棘寿终的最后确认,确认一过,脚下就只剩干净的地面。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

影炮:蓄一秒,暗影弹道贯穿全屏

【游戏功能】 蓄力技为什么总是单发?影炮偏要贯穿全屏:蓄一秒射一道暗影弹道穿全屏——线上所有目标各挨五十五,弹道从你脚下贯穿…

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

灼心:点燃它的心,出招即自损

【游戏功能】 灼烧为什么总烧在皮肤上?灼心偏要烧进心里:心被灼了六秒——六秒里怪每出一招就自损八,出得越多损得越多。这篇的核…

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

魂蜂:杀敌化蜂,至多三盏自动蜇击

【游戏功能】 魂卫为什么只有三盏就不能多了?魂蜂偏要做成可以积累的:杀掉小怪化一盏魂蜂跟着你走,至多三盏——三盏魂蜂各自两秒…

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

霜镜:架起霜镜,弹道冻着原路画回

【游戏功能】 镜墙为什么只能反弹不能冰冻?霜镜偏要双管齐下:弹道撞上霜镜原路画回去——回程的弹道还带着冰冻效果,扎中怪怪也冻…

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

穿心刺:一箭穿心,最大血量百分之六的穿透

【游戏功能】 单体射击为什么打不动厚血怪?穿心刺给的答案是:箭伤八加穿心伤,穿心伤等于最大血量百分之六——血越厚的怪越疼。这…

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

影刺:化影绕后,背刺一刀双倍

【游戏功能】 影刺的全机制就一句话:化影绕到它身后,从背刺出的那一刀双倍二十四——正面十二、背后二十四,它一转身就变白板。这…

2026-10-01 10:47 996 技术组