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

脚下暖光:治疗为什么要往地上做

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

【游戏功能】
一、先抛一个坑

为什么治疗特效几乎都做在脚下——光圈、上升的光粒、淡淡的暖雾,而不是像火球一样糊在角色脸上?把治疗做成全屏金光试试:闪一下,玩家看不到自己角色了,血回没回上全靠看数字。治疗特效的第一需求是"不挡人":它必须传达"正在恢复"这个状态,同时完全不干扰玩家对角色的注视。往地上做、往天上飘,是唯一同时满足两点的方向。

二、机制原理:地面为床,向上生长

一套完整的治疗表现分三件:地面暖光是主体,双圈椭圆呼吸环加一块柔和的径向渐变垫在脚下,亮度克制在两成透明度以内;上升光粒是生命感,粒子从脚下圆环内随机出生,携带着轻微横向漂移匀速上升,亮度和尺寸随高度衰减,到胸口高度之上消散;回复数字是结论,绿色加号数字从头顶飘起,这是唯一进入界面语义的元素。三件套的节奏也有讲究:光环先行半拍,粒子持续一点四秒,数字压轴,观感是"大地把力量输给角色",而不是"贴了一层金膜"。

demo
fx-heal

三、正确写法:治疗三件套(引擎侧)

lua
function CastHeal(caster, amount)
    local ground = GetGroundLayer()
    -- 1. 地面暖光: 双环呼吸 + 柔光罩
    local halo = CreateHealHalo(caster, HEAL_RADIUS)
    ground:AddChild(halo)
    halo:Breath(1.4)                                  -- 呼吸 1.4 秒后淡出

    -- 2. 上升光粒: 脚下出生, 匀速上升渐隐
    for i = 1, HEAL_PARTICLES do
        local a = math.random() * math.pi * 2
        local r = math.random() * HEAL_RADIUS
        local p = CreateRiseParticle(caster:GetX() + math.cos(a) * r,
                                     caster:GetY() - math.sin(a) * r * 0.35)
        p:SetVelocity((math.random() - 0.5) * 14, -(34 + math.random() * 40))
        p:FadeOutAbove(caster:GetY() - 130)            -- 过肩即隐
    end

    -- 3. 回复数字: 唯一进界面层的元素
    PerformWithDelayGlobal(function()
        caster:AddHP(amount)
        PopupGreenNumber(caster, "+" .. amount)
    end, 0.5)
end

四、四个必须钉死的细节

  1. 粒子上升超过肩线就消散,光粒穿过脸是治疗特效最常见的穿帮,消散高度挂在角色身高上而不是固定像素。2. 数字延迟半拍出现在光环亮起之后,治疗是"输"进去的不是"贴"上去的,时序即因果。3. 光环呼吸频率固定在一点四秒一个周期,多个治疗特效同屏时天然同步,错拍呼吸会显得像故障。4. 群体治疗复用同一套三件套只放大半径,别为群疗另做一套大特效——玩家对"治疗长什么样"有认知惯性,统一它。

五、心法:辅助的表现要退后

治疗三件套的克制可以推广成一族原则:增益、护盾、加速,所有"辅助系"的表现都要退后半步——信息要送达(正在生效)、注意力不抢(不挡人)、结论要清楚(数字与状态栏)。和输出系特效的抢眼逻辑正好相反,辅助系的好评来自"用久了没存在感,关掉了才发现少了"。往地上做、往天上飘、把结论交给数字,就是退后半步的三个具体姿势。

这个原则还有个判定口诀:表现能不能被截图。输出系特效截下来发群里,越炸越有人喝彩;辅助系特效截下来必须"看得见角色、看不见抢戏"——截图里角色被自己的治疗光糊了脸,无论多好看都是错的。两组表现的验收标准从根上就不同,用同一把"越炫越好"的尺子去量辅助系,量出来的全是灾难。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

Lua+元方法__close的错误传递:清理顺序与错误传播本质

【语法算法】 元方法 __close 的错误传递就这两行: to-be-closed 变量离开作用域时自动调用 __clos…

2026-09-29 18:43 996 技术组
进阶实战游戏功能

Lua+goto向后跳:重试循环的控制本质

【语法算法】 goto 向后跳的控制就这一行: ::retry:: 定义标签, goto retry 跳回标签——向后跳的全…

2026-09-29 18:43 996 技术组
进阶实战游戏功能

Lua+元方法__close的多资源:声明逆序清理的进阶本质

【语法算法】 元方法 __close 的多资源清理就这两行: 两个 to-be-closed 变量——声明的逆序清理——先关…

2026-09-29 18:43 996 技术组
进阶实战游戏功能

Lua+随机种子:随机数种子的确定性本质

【语法算法】 随机种子的确定性本质就这一行: 固定种子意味着随机数序列完全确定——同样的种子产生同样的序列——随机种子的全部…

2026-09-29 18:43 996 技术组
进阶实战游戏功能

Lua+协程状态机:coroutine.status的四种状态本质

【语法算法】 协程的状态机就这一行: status 返回四种字符串之一:"suspended"、"running"、"nor…

2026-09-29 18:43 996 技术组
进阶实战游戏功能

Lua+xpcall错误对象:debug.traceback的堆栈本质

【语法算法】 xpcall 的错误对象就这两行: xpcall 和 pcall 的本质区别就是第二个参数——错误处理函数——…

2026-09-29 18:43 996 技术组