【游戏功能】
竞技场出过一桩投诉:一个法师被战士近身后"原地起飞",战士的走位记录里明明是直线追击,人却像撞了墙一样反复被弹回起点。客服判定法师开挂,技术排查半天才发现——他开着抗拒火环,弹的确实是战士,而且是"合规的弹"。今天把这套"敢近身就给你弹开"的表现好好拆一遍。
一、一圈火、一条界、一个心理禁区
抗拒火环的表现核心不是火,是"界"。以角色为圆心铺一圈虚线近身圈,平时淡淡的几乎看不见——它是宣言,不是特效。狼怪踏进圈的一瞬间火环轰然爆发:双层冲击环贴地扩散、火花向四周炸开、狼怪沿径向原路弹飞,边退边翻滚、扬一路尘土,落地硬直。这里有个表现分寸:弹飞的姿态要"狼狈但不受伤",它没掉血,只是被推开了——所以数字用提示字("弹开!")而非伤害色。三次弹飞之后狼怪要有"学乖"反应:在圈外逡巡、原地打转、不再直线冲锋,这 little 细节让整个循环有了叙事闭环。
完整演示在这,默认自动循环,可调击退力度:
fx-repel
二、幂尔框架实现:径向速度一步到位
弹飞的本质是给目标一个沿径向向外的速度,衰减交给摩擦。触发判定挂在移动回调里:
local Repel = {}
local KEY = { RADIUS = 96, FRICTION = 3.2 }
function Repel.OnMove(target)
if not Repel.armed then return end
local self_ = SL:GetValue("selfActor")
local sx, sy = SL:GetValue("actorX", self_), SL:GetValue("actorY", self_)
local tx, ty = SL:GetValue("actorX", target), SL:GetValue("actorY", target)
local dx, dy = tx - sx, ty - sy
local dist = math.sqrt(dx * dx + dy * dy)
if dist > KEY.RADIUS or dist < 1 then return end
-- 命中近身圈: 径向单位向量
local nx, ny = dx / dist, dy / dist
SL:PlayActorAct(self_, "cast")
SL:PlayFxAt("fire_ring", sx, sy)
SL:ScreenShake(0.26, 4)
-- 核心一步:沿径向给速度,力度可配
local power = 300
SL:SetActorVelocity(target, nx * power, ny * power)
SL:ShowTipAbove(target, "弹开!")
SL:PlayActorAct(target, "stuck")
-- 速度衰减与落地硬直交给 WatchFly
Repel.WatchFly(target)
end
function Repel.WatchFly(target)
SL:Schedule(function(dt)
local vx, vy = SL:GetValue("actorVX", target), SL:GetValue("actorVY", target)
local sp = math.sqrt(vx * vx + vy * vy)
if sp < 18 then
SL:SetActorVelocity(target, 0, 0)
SL:UnSchedule("repelFly")
SL:PlayActorAct(target, "stuck")
else
SL:SetActorVelocity(target, vx * (1 - dt * KEY.FRICTION),
vy * (1 - dt * KEY.FRICTION))
-- 拖尾尘土
if math.random() < 0.3 then
SL:PlayFxAt("dust", SL:GetValue("actorX", target),
SL:GetValue("actorY", target))
end
end
end, 0.016, "repelFly")
end
return Repel
OnMove 挂引擎的移动回调,每步都查一次距离,半径外的目标零开销直接返回。
三、力度数值与边界保护
击退力度是唯一要调的大数值。力度太小,狼怪被弹出圈半步又迈回来,循环变成原地抖动;力度太大,一路撞到屏幕边上,观感像 bug。甜点区是"弹飞距离 ≈ 两个近身圈半径"——它落地的地方刚好在圈外一步,想再打你就要重新助跑,这一步的距离感就是攻防节奏。另外必须做边界保护:目标背后是墙或者地图边缘时,弹飞速度撞墙要提前清零,只播硬直不播滑行,不然怪会抖在墙缝里。
还有个容易被忽略的表现死角:弹飞途中目标的行为锁。这 0.8 秒里狼怪的 AI 要完全静默,不能再触发追击转向,否则速度和朝向打架,它会斜着漂移。幂尔框架的 SetActorVelocity 在目标带硬直标记时会被 AI 层覆盖,所以弹飞期间记得给目标挂上行为锁,落地再解。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 heat = heat + 1; if heat = 3 then rest = 1.6 ——两行管刀温的代码…
【游戏功能】 兄弟俩打一只狼,哥哥攒了三层劲自己放,一层加二十五;弟弟站在旁边干瞪眼——直到有人把劲递了过去:同样的三层,过…
【游戏功能】 有篇纠错单写得像小说:同一只狼,有人打它半小时血线稳如老狗,有人三分钟放倒——排查到最后发现,会打的那个从头到…
【游戏功能】 追着你满场跑的狼怪,为什么绕过一根石柱就懵在原地?脱影的答案藏在柱子背后:视线被石柱掐断一秒二,它脑子里"你"…
【游戏功能】 巡查群里有人喊邪门:同一套连招,昨天刀刀见血,今天刀刀被挡——查录像看到第三遍才看懂:狼怪学会了。他的出刀间隔…
【游戏功能】 if hand == last then acid = acid + 1 ——一行数手的判定,攒出了换手全部的…