You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Roblox Studio中遍历寻找Humanoid并追击最近目标(NPC开发)

解决NPC追击最近目标与距离判断问题

距离判断bug的核心原因

你写的代码只计算了X轴单方向的差值,然后错误调用了Magnitude——Magnitude是Vector3类型的属性,用来计算三维空间中的直线距离,单轴数值(比如X轴的差值)没有这个属性,实际运行时要么报错,要么得到的不是真实的三维距离,这就是NPC接触时距离数值完全不符合预期的原因。

正确的距离判断代码

直接取两个HumanoidRootPart的Position做向量减法,再获取Magnitude得到三维空间的直线距离:

local distance = (fighter.HumanoidRootPart.Position - closestEnemy.HumanoidRootPart.Position).Magnitude
if distance < 3 then
    -- 执行伤害逻辑
end

补充:遍历查找最近Humanoid的优化思路

虽然你已经解决了遍历问题,但可以优化逻辑减少无效计算:

  • 遍历Workspace中所有带Humanoid的对象,排除自身(避免NPC攻击自己)
  • 维护记录最近目标和距离的变量,遍历过程中实时更新
local function findClosestEnemy(fighter)
    local closestEnemy = nil
    local closestDistance = math.huge
    -- 遍历Workspace中所有带Humanoid的实例
    for _, obj in pairs(workspace:GetDescendants()) do
        local humanoid = obj:FindFirstChildOfClass("Humanoid")
        local rootPart = obj:FindFirstChild("HumanoidRootPart")
        -- 排除自身、无RootPart或已死亡的对象
        if humanoid and rootPart and obj ~= fighter and humanoid.Health > 0 then
            local distance = (fighter.HumanoidRootPart.Position - rootPart.Position).Magnitude
            if distance < closestDistance then
                closestDistance = distance
                closestEnemy = obj
            end
        end
    end
    return closestEnemy
end

内容的提问来源于stack exchange,提问作者Coder10101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:10:42