CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

圆月剑舞:转身一周剑光满圈

2026-09-28 17:50 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【游戏功能】

帮战回放里有个名场面:七八个对手把一个剑客围在中间,剑客原地一转,一圈剑光横扫出去,围圈的人齐齐后退半步——包围圈当场破了个口。今天拆的就是这个圆月剑舞,"转身一周、剑光满圈"的环身技能。

一、圆环的三种半径

环身技能的画面其实是三个圆在配合。第一个圆是剑光弧:两道对称的弧绕身横扫,扫过的位置留拖尾,转得越快拖尾越长,最后连成一轮满月。第二个圆是冲击环:剑光扫到射程边缘时贴地扩散一圈,告诉观众"这一圈的伤害到此为止"。第三个圆是光晕:人物周身常驻的一圈细环,呼吸闪烁,是射程提示也是技能开关的信号。三个圆的比例要压住——剑光弧最大、冲击环居中、光晕最小,大小倒挂就会像呼啦圈表演。横扫的椭圆压扁比接近地面透视(大约零点四),横着转不是竖着转,转错了轴就成了螺旋桨。

完整演示在这,默认自动循环,可调旋身圈数:

demo
fx-circleslash

二、幂尔框架实现:旋转相位驱动弧光

弧光的位置全部由旋转相位一个变量算出来,幂尔框架里一个定时器推相位:

lua
local CircleSlash = {}
local KEY = { SPIN_SPD = 3.2, ARC_LEN = 2.1 }

function Circle.Cast(self_)
    local spin = { a = 0 }
    SL:PlayActorAct(self_, "attack")
    SL:Schedule(function(dt)
        spin.a = spin.a + dt * KEY.SPIN_SPD * 6.28
        local total = SL:GetValue("spinRings") * 6.28
        -- 两道对称弧
        for half = 0, 1 do
            local a0 = spin.a + half * 3.1416
            SL:DrawArcFx("blade_arc", SL:GetValue("actorX", self_),
                         SL:GetValue("actorY", self_) - 46,
                         a0, a0 + KEY.ARC_LEN, 0.42)
        end
        -- 火花沿弧随机洒
        if math.random() < 0.5 then
            local ra = spin.a * 2
            SL:PlayBurst(SL:GetValue("actorX", self_) + math.cos(ra) * 74,
                         SL:GetValue("actorY", self_) - 46 + math.sin(ra) * 30,
                         "gold_spark", 1)
        end
        -- 扫中判定: 目标落在旋转半径覆盖区
        local target = SL:GetValue("curTarget")
        if target then
            local dx = SL:GetValue("actorX", target) - SL:GetValue("actorX", self_)
            if math.abs(dx) < 74 and not SL:GetValue("circleHitDone") then
                SL:SetValue("circleHitDone", true)
                SL:FreezeFrame(0.08)
                SL:PlayFxAt("impact_ring", SL:GetValue("actorX", self_),
                                           SL:GetValue("actorY", self_))
                SL:DeductHp(target, 26)
                SL:KnockBack(target, 42)
                SL:PlayActorAct(target, "stuck")
            end
        end
        if spin.a >= total then
            SL:UnSchedule("circleRun")
            SL:SetValue("circleHitDone", false)
            SL:PlayActorAct(self_, "idle")
        end
    end, 0.016, "circleRun")
end

return Circle

一次命中锁用 circleHitDone 做,转三圈也只算一刀,不然狼怪要在原地被抖三遍。

三、击退方向与收招节奏

环身技能的击退方向就是径向——从圆心指向目标,谁离得近谁被推得远。表现层要注意击退和旋转的时序:剑光扫过目标位置的那一帧才击退,提前了像隔空推人,延后了剑光穿身而过才弹开。收招的减速也很讲究:最后一圈要比前几圈慢两成,像刹车而不是急停,剑光的拖尾随减速拉长然后散开——扫出去的劲有个泄掉的过程,整段动作才收得住。最后归鞘那半秒人物回到持刀而立,光散、环灭、狼怪才爬起来——这三件事的顺序别乱,光没散干净就让怪起身,观众会觉得"它怎么不怕了"。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

回蓝:符纸的账,从普攻里抽

【游戏功能】 法师的困扰千篇一律:蓝条见底符纸哑火,站在怪堆里干瞪眼——直到有人给他看了一行账:符落三十五蓝,杖挥一刀回十二…

2026-09-30 19:25 996 技术组
进阶实战游戏功能

偷师:看它那一手,回头就还给它

【游戏功能】 地刺从脚底下炸出来的那半秒,大多数人的选择是躲——只有极少数人按下了偷师。偷师的机制是一场限时的一秒课:它抬手…

2026-09-30 19:25 996 技术组
进阶实战游戏功能

离间:让它们自己打自己

【游戏功能】 两只狼配合得像一个人:一只咬前蹄、一只扑后背,多少人栽在这对搭档手里——直到有人往白狼背上钉了一张嫁祸符。离间…

2026-09-30 19:25 996 技术组
进阶实战游戏功能

借体:把它的身子当盾,箭都钉它背上

【游戏功能】 弓狼在远处放冷箭,刀狼在近处追着你——两头受气的死局,怎么破?有老手给出的答案匪夷所思:往刀狼身后一站,让它替…

2026-09-30 19:25 996 技术组
进阶实战游戏功能

驱散:一层层剥它的好处

【游戏功能】 buffs[name] = nil ——一行删表项的代码,写尽了驱散全部的狠辣:狼怪顶着三层好处——狂暴加攻、…

2026-09-30 19:25 996 技术组
进阶实战游戏功能

箭囊:十二支箭数着打,囊空再装

【游戏功能】 弓箭手的伤害明明不低,为什么同样的怪别人十秒放倒、他要磨半分钟?看完他的操作就明白了:箭是乱射的,囊空了站在原…

2026-09-30 19:25 996 技术组