【游戏功能】
冰系控制为什么总在怪的身上?霜棘偏要长在玩家的身上——冰棘绕你八秒,它近身攻击就冻零点八加六点冻伤,但冰棘不认人:你近身它也冻。这篇的核心代码照引擎技能脚本的全规格写:配置表、冰棘构件、互冻状态机、定时器、调试按钮。
一、效果演示:一圈冰棘,两根晕条
演示场点「霜棘!」:八根冰棘从玩家脚下长出绕成一圈。大怪冲上来抡爪——爪子碰到冰棘的瞬间它自己冻了零点八秒、额外扣六点冻伤。但你抡刀碰它也会触发你自己的冰棘——你也会冻零点八秒。冰棘不认人,两个方向的近身都算"碰"。冰棘不认人,两个方向的近身攻击都算碰了冰棘的棘刺尖。两个方向的近身都算"碰"。冰棘和冰壁垒的交叉也值得做——壁垒挡住怪的路线、冰棘冻住怪的近身,防御系的两件工具一起开就是一面会冻人的墙。演示里先让它来撞你——它冻你看戏;再主动贴脸打它——你冻它看戏。冰棘的公平写在两个晕条的长短差里。
fx-frostthorn
二、底层原理:一圈冰棘加一对互冻判定
模块的机关是一对镜像。冰棘在身上挂八秒——挂的期间双方的近身攻击都触发冻。互冻的判定写在双方的攻击结算出口:玩家攻击命中时查怪的近身距离,怪攻击命中时查玩家的近身距离——距离在冰棘范围内就触发冻。和反伤的分野:反伤是"你打我你也疼",冻是"你打我你停下来"——疼和停是两种完全不同的惩罚。疼和停是两种完全不同的惩罚。冰棘的公平还有一层深意——它的存在逼着怪的行动做选择:近身攻击会冻、远程攻击打不着,怪的走位怎么选就是怪的智力测试。冰棘的公平写在"不认人"三个字上,这三个字也是冰棘的门槛。冰棘的公平写在"不认人"三个字上,这三个字也是冰棘的门槛。冻的有效也要有视觉——被冻的单位周身亮一层淡青的霜壳,霜壳在冻在、霜壳散了解冻——视觉的冰霜就是冻的倒计时。
三、核心代码:完整模块(上·骨架)
-- @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
四、核心代码:完整模块(下·定时器与互冻判定)
-- 冰棘入口
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 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 控制技能的镜像问题是:锁住了怪,自己是不是也闲着?影锁把这道两难摆上台面:影锁四秒,它动不了、你也动不了——它…
【游戏功能】 打断为什么只有"清读条"一种?震魂偏要反过来——不清招、不断势,打在它读条半途的那一劲顺着招震进腑——中劲十秒…
【游戏功能】 蜂群为什么总是一只一只出?蜂王偏要让它们进化:放一只蜂王出来,杀掉小怪喂它——喂三只升一阶,三阶蜂王的毒刺一秒…
【游戏功能】 技能为什么总是不扣自己的血?血刃偏要反着来:开着血刃的每一刀先扣自己二血、命中回三血——净赚一但要打得中,空刀…
【游戏功能】 bn.t = bn.t - dt ——一行旗面倒计时的代码,撑起了破军旗全部的紧迫感:旗立三秒、圈内加攻三成,…
【游戏功能】 淬毒为什么要一毒到底?淬毒刃偏要一层一层叠:一刀淬一层毒、毒层一秒六地烂,六层封顶之后一刀下去毒伤三十六——叠…