【游戏功能】
一、先抛一个坑
三段连斩的第一版做出来,策划看完只说了一句:"这是三个技能吧?"三刀的斩痕分别从上斜、下斜、平三个角度掠过,单看每一段都没问题,连起来却像三个互不相识的人轮流砍了一刀。多段连击的难度从来不在"打三下",在三下之间的关系——角度要有呼应,间隔要有节奏,收势要有交代。差了这口气,三段斩就是三个孤儿的拼盘。
二、机制原理:错层角度与段间节奏
三段连斩的排布要点。错层角度:三段斩痕分别取上斜、下斜、平斩三个角度,段与段之间的角度差在一百二十度上下,观感是"刀从不同方向缠着目标走"——锁定目标的三段斩打的都是头胸区域,角度差只是视觉的缠丝,判定始终在一个区域内。段间间隔:两百二十毫秒上下,快到不中断、慢到能数清,间隔做成可调参数,让策划自己找最舒服的连击呼吸。终结交代:第三段可选附带全方位冲击环,把"收势"演成一个小爆发——三段是铺垫,第三段是答案。
fx-ultslash
三、正确写法:三段错层连斩(幂尔版)
local TripleSlash = {}
local CONST = { MSG_ID = 12150, KEY = "TripleSlash", GAP = 0.22, AIM_H = 64 }
function TripleSlash.Cast(myID, targetID)
local tx = SL:GetValue("ACTOR_POSITION_X", targetID)
local angs = { -0.5, 0.5, 0 } -- 三段角度: 上斜/下斜/平
for i = 1, 3 do
SL:ScheduleOnce(function()
-- 每段: 斩痕角度错层, 命中同一头胸区域
SpawnSlashArc(tx, SL:GetValue("ACTOR_POSITION_Y", targetID) - CONST.AIM_H,
angs[i], i == 2)
SL:SendLuaNetMsg(CONST.MSG_ID, targetID, 0, 0,
SL:JsonEncode({ key = CONST.KEY, op = 2, hit = targetID, seg = i }))
if i == 3 and TripleShockEnabled() then -- 终结爆发
SpawnShockRing(tx, SL:GetValue("ACTOR_POSITION_Y", targetID))
end
end, (i - 1) * CONST.GAP * 1000)
end
end
SL:RegisterLuaNetMsg(CONST.MSG_ID, function(_, p1, p2, p3, msgData)
local d = SL:JsonDecode(msgData)
if d.key ~= CONST.KEY or d.op ~= 2 then return end
local m = FindActor(d.hit)
if m then m:RefreshHurt() end -- 每段刷新受击, 不重播全套
end)
return TripleSlash
四、四个必须钉死的细节
五、心法:连击的魂在段与段之间
三段连斩教的是"段间设计":每段独立看都平常,段与段之间的角度呼应、节奏递进、终结交代,才是连击的魂。多段技能的评审方法就是把段间空隙逐帧看一遍——空隙里全是设计,帧里只有施工。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 一、先抛一个坑 套圈摊位的圈扔出去,为什么有的游戏圈是抛物线飘过去的,有的是直线飞过去的?直线圈的判定简单,但…
【游戏功能】 一、一个被指针出卖的开箱 横向开箱卷轴首版上线,最刻薄的评论是:"减速那两秒我知道自己要出什么了,就问你尴尬不…
【游戏功能】 一、先抛一个坑 延时引爆类技能为什么非要给目标头顶挂一个倒计时圈,直接引信到点自动炸不行吗?自动炸的版本省了倒…
【游戏功能】 一、先抛一个坑 砸金蛋为什么非要用锤子砸,点一下直接开不行吗?从数值上讲两者毫无区别,从流水上讲差距十倍——玩…
【游戏功能】 一、一个刮不动的涂层 刮刮乐活动的首版测试报告很委屈:"刮片做出来了,玩家说刮不动。"技术上涂层是一张贴图,手…
【游戏功能】 一、一个被抢空的红包 红包雨活动上线十分钟就被迫关闭:红包生成没问题、下落没问题、点击抢取也没问题——问题是并…