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

NPC跟随脚本无法运行且无报错问题求助(附代码)

Roblox NPC跟随脚本无运行无报错问题排查

以下是你提供的问题代码:

local connection = path.Reached:Connect(function()
            reached = true
            script.Parent.Reached:Fire(target)
        end)
        repeat
            chasing = true
            followingTarget = target
            -- enable stuff for target
            target.GettingChased.Value = true
            target.GettingChasedBy.Value = script.Parent
            TeddyAI.Chasing.Value = true
            local plr = game.Players:GetPlayerFromCharacter(target.Character)
            path:Run(target.Character.HumanoidRootPart.Position)
        until not path or path.LastError == "ComputationError" or not target.Character or target.Character:FindFirstChild("HumanoidRootPart") == nil or target.Character.Humanoid.Health < 1 or target.Safe.Value or findPotentialTarget() ~= target or reached
        if connection then
            connection:Disconnect()
        end
        if findPotentialTarget() ~= target then
            if path and path._moveConnection then
                path:Stop()
            end
        end
        print("stopped")
        chasing = false
    else
        print("block to block")
        blockToBlock()
    end
    game:GetService("RunService").Heartbeat:Wait()
end

核心问题分析

  1. 重复调用path:Run()导致路径重置
    repeat-until循环会反复执行path:Run(),每次调用都会中断当前路径计算并重新开始,NPC根本没有时间移动,看起来像是脚本未运行。

  2. reached变量未正确初始化
    代码中reached未在循环前初始化,默认值为nil(Lua中视为false),若path.Reached事件未触发,循环会无限执行,脚本卡死在循环内。

  3. 路径事件连接逻辑混乱
    path.Reached连接创建在循环外,但循环内多次调用path:Run(),会导致旧的路径事件未正确处理,新路径的触发逻辑被覆盖。

修复方案

  1. 移除循环内的path:Run()调用
    只在开始追踪时调用一次path:Run(),通过事件和条件检查来处理停止逻辑,而非重复触发路径计算:

    local reached = false
    local connection = path.Reached:Connect(function()
        reached = true
        script.Parent.Reached:Fire(target)
    end)
    
    chasing = true
    followingTarget = target
    -- 标记目标状态
    target.GettingChased.Value = true
    target.GettingChasedBy.Value = script.Parent
    TeddyAI.Chasing.Value = true
    
    -- 仅调用一次路径计算,添加错误捕获
    local success, err = pcall(function()
        path:Run(target.Character.HumanoidRootPart.Position)
    end)
    if not success then
        warn("路径执行错误: " .. err)
        reached = true -- 触发循环退出
    end
    
    -- 改用循环监听停止条件
    while not reached do
        task.wait()
        -- 检查停止条件
        if not path 
            or path.LastError == "ComputationError" 
            or not target.Character 
            or not target.Character:FindFirstChild("HumanoidRootPart")
            or target.Character.Humanoid.Health < 1 
            or target.Safe.Value 
            or findPotentialTarget() ~= target then
            reached = true
            if path and path._moveConnection then
                path:Stop()
            end
        end
    end
    
    connection:Disconnect()
    print("stopped")
    chasing = false
    
  2. 确保path对象正确初始化
    确认PathfindingService创建路径时参数匹配NPC的尺寸,避免路径计算失败:

    local PathfindingService = game:GetService("PathfindingService")
    local path = PathfindingService:CreatePath({
        AgentRadius = 2, -- 匹配NPC碰撞体半径
        AgentHeight = 5, -- 匹配NPC高度
        AgentCanJump = true -- 根据NPC能力设置
    })
    
  3. 添加错误捕获
    用pcall包裹path:Run(),捕获隐藏错误,避免脚本静默失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:10:46