设为首页收藏本站
  • 官方微信
    lmkj_wx 微信公众号 添加方式:
    1:扫描左侧二维码
  • 手机访问
    lmkj_sj
  •  找回密码
     立即注册

    QQ登录

    只需一步,快速开始

    查看: 1|回复: 0

    hero引擎中如何处理伤害的范围伤害分摊问题

    [复制链接]
    avatar
    • 打卡等级:魔龙套勇士
    • 打卡总天数:98
    • 打卡月天数:22
    • 打卡总奖励:11436
    • 最近打卡:2025-07-22 00:17:43

    5883

    主题

    96

    回帖

    7395

    积分

    管理员

    本站站长

    积分
    7395
    online_admin 发表于 昨天 18:41 | 显示全部楼层 |阅读模式
    在 Hero 引擎中,范围伤害的分摊问题(即技能攻击多个目标时,如何合理分配总伤害以避免群体伤害过高)需要通过脚本逻辑实现,核心是根据范围内的目标数量动态调整单个目标所受伤害。以下是具体处理方法和脚本示例:
    一、范围伤害分摊的核心思路
    常见的分摊逻辑有 3 种,可根据技能平衡需求选择:

    平均分摊:总伤害固定,按目标数量平均分配(如总伤害 = 1000,2 个目标各受 500 伤害)。
    递减分摊:目标数量越多,单个目标伤害衰减越慢(如 1 个目标受 100% 伤害,2 个各受 60%,3 个各受 40%)。
    基础伤害 + 数量系数:单个目标基础伤害固定,总伤害随目标数量增加而小幅提升(如每个目标基础伤害 200,每多 1 个目标总伤害增加 50)。
    二、实现步骤与脚本示例
    以法师群体技能 “烈焰风暴”(技能 ID=1002)为例,在Skill1002.txt中实现范围伤害分摊:
    1. 定义技能等级参数(包含分摊相关配置)
    lua
    Level 1
    {
        Range = 3  ; 范围半径(3格)
        BaseTotalDamage = 800  ; 基础总伤害(1个目标时的总伤害)
        MinSingleDamage = 100  ; 单个目标最小伤害(避免分摊后伤害过低)
        DecayRate = 0.7  ; 递减系数(每多1个目标,单个伤害为上一数量的70%)
    }

    Level 2
    {
        Range = 4
        BaseTotalDamage = 1200
        MinSingleDamage = 150
        DecayRate = 0.75  ; 更高等级衰减更慢(群体伤害更强)
    }
    2. 核心逻辑:获取目标列表并计算分摊伤害
    在Release模块中,通过以下步骤实现:

    lua
    Release
    {
        ; 检查释放条件(省略)
        if (GetMP() < NeedMP) then return 0 end

        ; 1. 获取范围内所有目标(返回目标ID列表)
        local targetList = GetAreaTargetList(Range)  ; 获取Range范围内的所有敌对目标
        local targetCount = GetListCount(targetList)  ; 目标数量(如2个目标返回2)

        ; 若没有目标,提示并终止
        if (targetCount == 0) then
            SendMsg 7 "范围内没有目标!"
            return 0
        end

        ; 2. 根据目标数量计算单个目标伤害(以“递减分摊”为例)
        local singleDamage
        if (targetCount == 1) then
            ; 单个目标时,直接使用基础总伤害
            singleDamage = BaseTotalDamage
        else
            ; 多个目标时:单个伤害 = 基础总伤害 × (递减系数^(目标数量-1))
            ; 例:2个目标 → 800 × 0.7^(1) = 560;3个目标 → 800 × 0.7^2 = 392
            singleDamage = BaseTotalDamage * (DecayRate ^ (targetCount - 1))
        end

        ; 3. 确保单个伤害不低于最小值(防止过多目标导致伤害趋近于0)
        if (singleDamage < MinSingleDamage) then
            singleDamage = MinSingleDamage
        end

        ; 4. 对每个目标应用伤害(循环遍历目标列表)
        for i = 1, targetCount do
            local target = GetListValue(targetList, i)  ; 获取第i个目标的ID
            SetCurrentTarget target  ; 切换当前目标

            ; 执行伤害(可叠加其他效果,如元素伤害)
            SubHP Target, singleDamage
            SendMsg 6 "你对" + GetTargetName() + "造成" + singleDamage + "点火焰伤害!"
        end

        ; 后续逻辑:扣除MP、播放特效等
        SubMP NeedMP
        PlaySound 503
        return 1
    }
    三、不同分摊方式的公式实现
    1. 平均分摊(总伤害固定,按数量平分)
    lua
    ; 总伤害固定为BaseTotalDamage,每个目标受伤害=总伤害/目标数量
    local totalDamage = BaseTotalDamage
    singleDamage = totalDamage / targetCount
    ; 取整(避免小数)
    singleDamage = Int(singleDamage)
    2. 基础伤害 + 数量系数(总伤害随目标数量增加)
    lua
    ; 单个目标基础伤害=BaseSingleDamage,每多1个目标总伤害+AddPerTarget
    local baseSingle = 200  ; 单个目标基础伤害
    local addPerTarget = 50  ; 每多1个目标增加的总伤害
    local totalDamage = baseSingle + (targetCount - 1) * addPerTarget
    singleDamage = totalDamage / targetCount  ; 平均到每个目标
    四、关键函数与注意事项
    核心函数:
    GetAreaTargetList(Range):获取以释放者为中心、Range 范围内的所有敌对目标(返回列表)。
    GetListCount(列表):获取列表中的目标数量。
    GetListValue(列表, 索引):获取列表中指定索引的目标 ID(索引从 1 开始)。
    SetCurrentTarget(目标ID):切换当前操作的目标,确保SubHP等函数正确作用于目标。
    避坑要点:
    防止除以 0:必须先判断targetCount > 0,否则可能导致脚本错误。
    整数处理:Hero 引擎中伤害值通常为整数,用Int(X)函数取整(如singleDamage = Int(singleDamage))。
    目标有效性:循环伤害前可加if (IsTargetValid(target) == 1)判断目标是否存活(避免对已死亡目标造成伤害)。
    平衡建议:
    群体技能的单目标伤害应低于同等级单体技能(如单体技能伤害是群体单目标的 1.5-2 倍)。
    随技能等级提升,可降低DecayRate(如等级 5 时DecayRate=0.85),让高等级群体技能更强势。

    通过以上配置,即可实现范围伤害的合理分摊,避免群体技能在多目标场景下过于失衡。可根据技能定位(如控制型、输出型)调整分摊公式和参数。

    您需要登录后才可以回帖 登录 | 立即注册 qq_login

    本版积分规则

    QQArchiver 手机版 小黑屋 39传奇素材网 ( 蜀ICP备2022016510号-3 )

    快速回复 快速发帖 返回顶部 返回列表