【游戏功能】
先抛一个坑:影子的那半刀,为什么要慢半秒才落?跟刀的影子要是和你同时出手,它就是第二个你,热闹是热闹,玩家很快就把它当成了固定的输出倍率。慢半秒的跟刀有自己的节奏——你的刀音落下之后,它的半刀像回声一样追上来,账面上多七点,耳朵里多一声余韵。这篇把影从随行整套写法拆开:唤影出窍、随行跟刀、半拍回声、归位再唤,一段一段照抄能跑。
一、效果演示
演示场侠客身边多出一道半透明的银影。点「唤影!」:影子出窍随行十二秒——你每中一刀,半秒后它补上一记七点的银字小刀,你砍的节奏里多出一声回声。十二秒到影子归位,歇六秒才能再唤。唤与不唤、什么时候唤,输出曲线就在这半刀的回声里厚起来。
flowchart TD
A[点唤影] --> B{影子歇够了吗}
B -- 没有 --> C[拦下等CD]
B -- 好了 --> D[影从出窍十二秒]
D --> E[你中一刀]
E --> F[半秒后跟半刀七点]
F --> G{十二秒到了吗}
G -- 没有 --> E
G -- 到了 --> H[归位 歇六秒]
fx-crest-echo
二、底层原理
影从系统的机关是"随行跟刀"——影子不独立出手,只读你的命中账:你中一刀,半秒后它补半刀七点。这条"读账不掷骰"的规矩让影子永远和你同频:你停手它歇着,你爆发它跟进,影从是输出的回声不是第二台机器。半秒的延迟是回声的魂——同时落的双刀是复制粘贴,慢半拍的跟刀才听得出层次,账面上是七点,体感里是一声应和。
随行有时限:十二秒出窍归位,歇六秒再唤——影子是借来的力,不是常驻的挂件,唤的时机成了小算计:留着急用还是现在就开。影子的画面半透明银色,站位贴在你侧后半格,你动它随动,你出手它虚晃——像不像三分真。幂尔框架这边跟刀挂在命中结算的尾巴上,半秒的延迟用延后结算自检前提,归位回收一条口子清干净。
这套玩法的代码量不到八十行,难的不是跟刀而是那半秒——同时落的是倍率,慢半拍的才是回声。
再看跟刀的延后结算为什么要自检——半秒在战斗里够世界变一次样:怪倒了、窗口关了、你换了目标,影子补刀前都得重新问一遍前提,前提不在就安静作废。延后结算最忌拿着出发时的旧地图走完全程——出发时怪在,落地时怪没了,这一刀要追着空气砍。自检一遍前提,是所有延后账的礼貌。
三、核心代码:完整模块(上·骨架)
-- @file CrestEcho.lua
-- 影从纹 —— 你砍一刀 影子跟半刀
local CrestEcho = {}
local CONST = {
DURATION = 12,
REST_CD = 6,
FOLLOW_DELAY = 0.5,
FOLLOW_DMG = 7,
AUTOINC_BASE = 1201200,
}
local _on = false
local _left = 0
local _cd = 0
local _autoInc = 0
local function ShowTip(msg)
if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end
local function GenID()
_autoInc = _autoInc + 1
return CONST.AUTOINC_BASE + _autoInc
end
function CrestEcho.IsOn() return _on end
-- 唤影: 出窍有时限
function CrestEcho.Summon()
if _on then
ShowTip("影从已经跟着了")
return
end
if _cd > 0 then
ShowTip("影子还没歇够——再等" .. math.ceil(_cd) .. "秒")
return
end
_on = true
_left = CONST.DURATION
ShowTip("影从出窍" .. CONST.DURATION .. "秒——你一刀它半刀")
end
四、核心代码:完整模块(下·推进与卸载)
-- 跟刀: 延后结算先自检前提
function CrestEcho.Follow(targetIn)
if not _on then return 0 end
local fireIn = CONST.FOLLOW_DELAY
-- 战斗侧在延迟到点时回调 OnLand 并重新核对 targetIn
return fireIn, function(stillIn)
if stillIn and _on then
ShowTip("影从补刀——" .. CONST.FOLLOW_DMG .. "点")
return CONST.FOLLOW_DMG
end
return 0
end
end
if not _ticker then
_ticker = SL:Schedule(function(dt)
if _cd > 0 then _cd = _cd - dt end
if not _on then return end
_left = _left - dt
if _left <= 0 then
_on = false
_cd = CONST.REST_CD
ShowTip("影从归位——歇六秒再唤")
end
end, 0.05)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("唤影!", function()
CrestEcho.Summon()
end)
ShowTip("技能已加载: 影从纹")
end, 1.0)
function CrestEcho.Unload()
if _ticker then SL:Unschedule(_ticker) end
_on = false
_left = 0
end
return CrestEcho
五、机制问答
问:跟刀为什么慢半秒?
答:同时落的双刀是复制粘贴——慢半拍的跟刀才是回声,账上七点耳朵里一声应和。
问:影子为什么不独立出手?
答:读账不掷骰——永远和你同频,你停它歇你爆发它跟进,影从是回声不是第二台机器。
问:随行为什么要限时?
答:借来的力不做常驻挂件——十二秒的窗口让唤的时机成为小算计。
问:补刀前为什么要自检前提?
答:半秒够世界变一次样——怪倒了窗口关了,延后的刀要安静作废,不追着空气砍。
问:影子为什么贴侧后半格?
答:随行的位置感——像不像三分真,影子跟着你走的才像长在身上,钉在原地的只是幻灯。
六、调参与实战怎么用
参数层面三个量——随行时长、跟刀延迟、半刀伤害。延迟半秒是回声的甜点:同拍成倍率,一秒以上断了气。实战里这套读账跟刀的骨架能搬去灵宠协战、亡语追击、余震补刀,全是读命中账、延迟兑现、限时随行一条线。常见坑两个:影子独立出手成了第二输出位;延后结算不自检,刀追空气。
补充一个设计层面的思考——主动型机制的反馈要"先给判断依据,再给判定的结果":预警先亮、窗口先画、结果后到,玩家输赢都输赢在自己看得懂的信息上。判定依据藏起来的主动机制是运气测试器,玩家赢了不知道为什么赢,输了不知道该改什么——信息给足,操作才有成长感。
补充一个维护层面的思考——带位置和窗口的状态,重载的时候要跟着账本一起走:火圈烧到第几秒、窗口还剩几刀、闪身的朝向停在哪一边,这些都是账,不是画面。画面可以重建,账不能丢也不能多——重载后圈还在账没了、账还在圈没了,都是清场清了一半的活。
补充一个工程层面的思考——延后结算的跟随判定要带自检:影子补的那一刀、反噬的那一记,落地前先看怪还在不在场、窗口还开不开,条件不成立就安静作废。延后的结算最会撞上"世界已经变了"的尴尬,每一次延后都要自己重新问一遍前提。
写完留一句给做随行系的同学:玩家要的影子是回声不是替身——慢半秒的跟刀,账薄一声长,听着就踏实。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…