CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
网络通信

【网络通信】碰撞检测:圆形碰撞的粗筛与精判

2026-09-21 16:45 作者:996 技术组 0 阅读 网络通信

实战应用:用在哪里

范围技能要不要命中目标、拾取点够不够近、怪物攻击有没有够到——碰撞判定无处不在。圆形碰撞是游戏世界的标准模型,粗筛与精判的两段式判定让千人同屏的碰撞计算的成本可控。

两段式的判定

lua

---粗筛:距离平方比较,免开方
local function broadPhase(ax, ay, bx, by, range)
    local dx = ax - bx
    local dy = ay - by
    return dx * dx + dy * dy <= range * range
end

---精判:技能扇形的角度校验
local function narrowPhase(actor, tx, ty, face, arc)
    local dx = tx - actor.x
    local dy = ty - actor.y
    local ang = math.deg(math.atan2(dy, dx))
    local diff = math.abs((ang - face + 180) % 360 - 180)
    return diff <= arc / 2
end

---烈火剑法的判定:2 格扇形 90 度
function Combat.fireSwordHit(actor, target)
    if not broadPhase(actor.x, actor.y, target.x, target.y, 2) then
        return false
    end
    return narrowPhase(actor, target.x, target.y,
        actor:GetFacing(), 90)
end

粗筛用距离平方比较:不开方,一次乘法两次减法完成圆的包含判定,性能是开方版本的数倍。粗筛不过的直接淘汰,粗筛过了的进精判——扇形技能在圆的包含之外再校验角度差,角度的归一化处理让 359 度与 1 度的差值算成 2 度而不是 358 度。烈火剑法的 2 格 90 度扇形在两段式下:粗筛淘汰八成的远处目标,精判只处理视野内的一小撮。

批量的优化

lua

---群体技能的批量判定:先桶后筛
function Combat.aoeHit(actor, cx, cy, radius, arc)
    local hits = {}
    local candidates = Grid.queryCircle(cx, cy, radius)
    for _, t in ipairs(candidates) do
        if broadPhase(cx, cy, t.x, t.y, radius)
            and narrowPhase(actor, t.x, t.y,
                actor:GetFacing(), arc) then
            hits[#hits + 1] = t
            if #hits >= 12 then break end   -- 单次上限
        end
    end
    return hits
end

群体技能的判定在 AOI 桶上做:先取圆形区域的候选集(格子级粗筛),再逐个做圆与扇形的精判,单次命中上限 12 个封顶结算成本。判定顺序的纪律:廉价的先做(平方距离)、昂贵的后做(角度与开方)、有上限的截断在循环内。命中数的上限与飘字的密度联动,千个目标的群体技能不产生千条飘字——判定的成本与表现的成本一起管。

验证与监控

判定的单测覆盖边界:恰好在半径上、扇形边缘角、归一化的跨零角度;单次技能的判定耗时抽样,超 2 毫秒即回查候选集的规模。

踩坑记录

角度差曾经没归一化,背对目标的玩家吃到了正面技能,跨零的取模修正。粗筛曾经用了开方的距离比较,千人群技的判定耗时翻三倍,平方比较回归。候选集曾经取全图玩家列表,AOI 桶的接入让候选集缩到视野级。

上线要点

技能的形状参数(半径、扇角、上限)进技能表,判定逻辑不感知数值。判定的日志带粗筛与精判的漏斗计数,性能的分布一目了然。碰撞的参数与客户端的表现半径同源,视觉与判定的一致从数据层保证。

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

作者履历与出处

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

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

最新技术文章 · 实战干货

LATEST ARTICLES

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

玩法策划沙巴克税收

【玩法策划】沙城税务官:税收分配与廉政度的玩法设计

实战应用:用在哪里 沙巴克占领行会坐收税收却只进不出,非占领行会的玩家心里不平衡。税务官玩法把税收做成明账:占领行会对摆摊与…

2026-09-23 01:24 996 技术组 · 0 阅读
玩法策划比武社交

【玩法策划】比武招亲:比武切磋与社交绑定的玩法设计

实战应用:用在哪里 高端玩家婚姻系统只有仪式没有过程,社交绑定缺一个高光事件。比武招亲做成擂台玩法:擂主设擂摆彩头,攻擂者报…

2026-09-23 01:24 996 技术组 · 0 阅读
案例复盘限时礼包日期

【案例复盘】限时礼包少发一天的事故复盘

实战应用:用在哪里 开服七日限时礼包发到第六天断了粮,9 月 1 日当天领奖按钮灰的,投诉当天破千。事故根因是一条数字日期循…

2026-09-23 01:24 996 技术组 · 0 阅读
网络通信心跳假在线

【网络通信】心跳探测:半开连接的主动识别

实战应用:用在哪里 玩家拔线不退游戏,连接半开着,人不在指令也没有,在线数虚高,容量预案被假数据带着跑。心跳探测给每个在线玩…

2026-09-23 01:24 996 技术组 · 0 阅读
运维发布发布日历

【运维发布】发布日历:全月变更的集中排期

实战应用:用在哪里 周三发了合成系统补丁,周四又改强化概率,两条变更叠加后玩家分不清是哪个改出来的。发布日历把全月变更集中排…

2026-09-23 01:24 996 技术组 · 0 阅读
Lua实战滑动窗口计数

【Lua实战】时间窗口计数:滑动窗口的环形数组实现

实战应用:用在哪里 容量预案需要知道滚动一小时的副本进入峰值,而不是全天累计。滑动窗口用 60 个槽位每槽记一分钟的进入数,…

2026-09-23 01:24 996 技术组 · 0 阅读