【游戏功能】
回放里看得一清二楚:BOSS 抬手的瞬间满屏玩家四散,只有一个战士迎着冲上去起跳——落点精准砸在 BOSS 头顶判定框上,一套脆皮直接被压进地面。全场都在问这跳是怎么跳的。今天拆俯冲贯日,讲讲"从天而降"这类技能的表现层门道。
一、悬停的那半秒是给观众看的
俯冲的时间轴四段:起跳、悬停、俯冲、落地。起跳沿抛物线上到最高点,普通跳这里是下落的开始,俯冲技却要在此悬停零点三五秒——身体微微浮动、影子缩到最小、地面上的目标头顶亮起锁定标记。这半秒是整段表演的枢纽:它告诉所有人"要下来了",也给了狼怪"该跑了"的错觉。俯冲段斜线直插,人后拖一条白色气浪,速度感全靠这条渐隐拖尾。落地段在接触狼怪头胸判定框的瞬间炸开:双层冲击环贴地扩散、白闪、震屏、尘暴从落点向两侧翻起。四段里观众记住的永远只有悬停那半秒——憋得越久,砸得越响。
完整演示在这,默认自动循环,可调俯冲速度:
fx-dive
二、幂尔框架实现:三段各自独立的状态机
俯冲不是一条曲线,是三个状态的接力,幂尔框架里各自驱动:
local Dive = {}
local KEY = { HOVER = 0.35, DIVE_V = 700 }
local st = { phase = "idle", t = 0 }
local function SetState(name)
st.phase = name
st.t = 0
end
function Dive.Cast(self_, target)
if st.phase ~= "idle" then return end
SetState("jump")
SL:Schedule(function(dt)
st.t = st.t + dt
if st.phase == "jump" then
-- 抛物线起跳, 0.5 秒到顶
local k = math.min(1, st.t / 0.5)
SL:SetActorOffsetY(self_, -180 * math.sin(k * 3.1416))
SL:SetActorShadow(self_, math.max(0.35, 1 - k * 0.65))
if k >= 1 then
SetState("hover")
SL:PlayFxAt("lock_mark", SL:GetValue("actorX", target),
SL:GetValue("actorY", target) - 100)
end
elseif st.phase == "hover" then
if st.t >= KEY.HOVER then
SetState("dive")
local tx, ty = SL:GetValue("actorX", target),
SL:GetValue("actorY", target) - 58
SL:PlayFlyFx("dive_line", SL:GetValue("actorX", self_),
SL:GetValue("actorY", self_), tx, ty,
KEY.DIVE_V)
end
end
end, 0.016, "diveRun")
end
-- 飞行体到达回调: 俯冲命中
function Dive.OnArrive(self_, target)
SetState("land")
SL:SetActorOffsetY(self_, 0)
SL:SetActorShadow(self_, 1)
SL:ScreenShake(0.32, 6)
SL:PlayFxAt("impact_ring", SL:GetValue("actorX", target),
SL:GetValue("actorY", target))
SL:DeductHp(target, 42)
SL:ShowHitNum(target, 42, "dive")
SL:PlayActorAct(target, "stuck")
SL:ScheduleOnce(function() SetState("idle") end, 1.4)
end
return Dive
悬停的浮动用正弦叠加在偏移上,幅度三个像素——多一像素都像挂在钩子上。
三、落点与锁定标记的诚实性
锁定标记是给观众的,但不能骗玩家:标记亮起后目标如果位移,俯冲落点要不要跟随?追踪型俯冲(必中)和固定落点型(可躲)必须二选一并贯彻到底,最忌讳标记画在目标身上、落点却钉在原地——玩家看到标记跑了以为躲掉了,人却砸了下来,这种"视觉说谎"一次就能毁掉一个技能的口碑。演示里选择的是标记跟身、落点半跟随:俯冲启动瞬间锁定当前位置偏移量,之后目标小幅移动照砸,大位移才落空,两边都留了余地。
尘暴的颜色再强调一次:土黄,别用灰白。灰白是烟,土黄是土,落地这个语境里只有土是对的。尘暴的粒子数和震屏强度在多技能同屏时要让位——俯冲是独占帧,同时别人放火雨的话,尘暴减半,别抢戏。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 heat = heat + 1; if heat = 3 then rest = 1.6 ——两行管刀温的代码…
【游戏功能】 兄弟俩打一只狼,哥哥攒了三层劲自己放,一层加二十五;弟弟站在旁边干瞪眼——直到有人把劲递了过去:同样的三层,过…
【游戏功能】 有篇纠错单写得像小说:同一只狼,有人打它半小时血线稳如老狗,有人三分钟放倒——排查到最后发现,会打的那个从头到…
【游戏功能】 追着你满场跑的狼怪,为什么绕过一根石柱就懵在原地?脱影的答案藏在柱子背后:视线被石柱掐断一秒二,它脑子里"你"…
【游戏功能】 巡查群里有人喊邪门:同一套连招,昨天刀刀见血,今天刀刀被挡——查录像看到第三遍才看懂:狼怪学会了。他的出刀间隔…
【游戏功能】 if hand == last then acid = acid + 1 ——一行数手的判定,攒出了换手全部的…