【游戏功能】
一、一次团灭全场的连锁
尸爆机制第一次上内测,一只精英怪死在怪堆正中间,两秒后连环五爆,全场清空——本该是精彩的时刻,测试的反馈是"这什么玩意儿把我秒了"。问题不在伤害数值,在表现铺垫:尸体爆炸前的充能阶段没有任何视觉提示,玩家不知道脚边的尸体是颗定时炸弹。加上充能表现之后同一套数值再测:尸体泛红光、抖动越来越凶、两秒后炸开,玩家开始有意识地拉开距离,击杀选址变成了新策略——机制没动一分,体验天壤之别。
二、机制原理:充能、爆炸、连锁
尸爆是个三段闭环。充能段:怪物死亡动作播完、尸体停留的同时 fuse 计时器开始倒数,视觉是红光从无到有渐盛、抖动幅度随剩余时间增大——这两条曲线是玩家的逃生倒计时,读得懂光就读得懂死。爆炸段:倒计时归零,扩散光环加迸射火星,椭圆范围内活体掉血、飘字、受击。连锁段:被爆炸波及致死的怪,尸体同样进入充能——只是引信更短,一串尸体像多米诺。连锁的深度就是玩家走位的博弈空间:往怪堆里打是高收益高风险,往外围拆解是稳但慢。
fx-corpsebomb
三、正确写法:尸爆闭环(引擎侧)
function gameActorMonster:EnterDeadState()
self._keepLastFrame = true
self:PlayAction(global.MMO.ANIM_DIE)
if self._explodeOnDead then
self._fuse = 2.0 -- 充能 2 秒
SpawnChargeGlow(self, 2.0) -- 红光渐盛+抖动加剧
end
end
function gameActorMonster:UpdateDead(dt)
if not self._fuse then return end
self._fuse = self._fuse - dt
self._root:setPositionX(self._ox + (math.random() - 0.5) * (2 - self._fuse) * 3)
if self._fuse <= 0 then self:CorpseExplode() end
end
function gameActorMonster:CorpseExplode()
SpawnExplode(self._x, self._y)
local R = global.QuakeConfig.CorpseBombRadius
for _, m in ipairs(GetMonstersAround(self, R)) do
if m ~= self and m:Alive() then
m:OnHit(30)
if not m:Alive() then
m._explodeOnDead = true
m._fuseLen = 1.6 -- 连锁引信更短
end
end
end
self:RealRemove()
end
四、四个必须钉死的细节
五、心法:危险必须可读
尸爆的翻车与修复说明一条铁律:任何新增的危险源,必须配套等量的可读性。充能红光是危险的说明书,抖动加剧是倒计时的指针,玩家读得懂才有"下次我知道怎么办"。反过来,隐藏的危险不是难度是欺骗——欺骗一次,玩家对整个战场信息的信任崩塌,之后所有机制的演出他们都不再相信。危险明码标价,博弈才有意义。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 无极真气的全部开关就这一行:给角色挂一层六秒的金气光环。但光环底下压着三条规矩——窗口期、三刀递增、过期作废。…
【游戏功能】 气功波为什么不掉血?战士一掌把狼怪推出去三步开外,狼怪头顶连个伤害数字都没有——新手第一反应是"技能没生效",…
【游戏功能】 法术共振报错刷了半屏: bolt target moved: anchor stale ——第一道雷落下到第二…
【游戏功能】 上周团里法师连放七个玄冰刺,怪的血没掉多少,指挥却在喊"完美控场"——直到有人回放录像才发现,狼怪绕着冰圈外圈…
【游戏功能】 彻地钉整套表现的钥匙就这一行:钉子不是打在狼怪身上,是从 地里的固定点 窜出来。今天顺着这行拆彻地钉——为什么…
【游戏功能】 道士的符为什么追着人咬?你明明看着它出手时冲左,狼怪往右一挪,符在半空拐了个弯还是贴上它的胸口——这不是弹道,…