← Все практические скрипты
NPC · Продвинутый · 30 мин

NPC преследует ближайшего игрока

Противник замечает героя поблизости и бежит за ним.

Иллюстрация: NPC преследует ближайшего игрока
🎯 Что получится

NPC находит ближайшего живого игрока в радиусе 60 studs и пытается приблизиться к нему. В этой версии он не атакует.

1. Подготовьте объект

Где разместить: Обычный Script в ServerScriptService

Через Rig Builder создайте NPC с Humanoid и HumanoidRootPart, назовите модель ChaserNPC. Части персонажа должны быть не Anchored.
Добавьте в ServerScriptService обычный Script с кодом. Разместите вокруг NPC несколько широких препятствий и оставьте проходы.
Нажмите Play. NPC будет искать ближайшего живого игрока в радиусе 65 studs и регулярно перестраивать путь через PathfindingService.
Это базовый учебный AI: для сложных карт позже понадобятся обработка застреваний, Path.Blocked и полноценная система состояний.

2. Вставьте код

Script
-- Script в ServerScriptService: NPC с поиском пути
local Players = game:GetService("Players")
local PathfindingService = game:GetService("PathfindingService")
local npc = workspace:WaitForChild("ChaserNPC")
local humanoid = npc:WaitForChild("Humanoid")
local root = npc:WaitForChild("HumanoidRootPart")
local RANGE = 65
local REPATH_DELAY = 0.55
humanoid.WalkSpeed = 15
pcall(function() root:SetNetworkOwner(nil) end)

local function nearestRoot()
    local best, distance = nil, RANGE
    for _, player in ipairs(Players:GetPlayers()) do
        local character = player.Character
        local targetHum = character and character:FindFirstChildOfClass("Humanoid")
        local targetRoot = character and character:FindFirstChild("HumanoidRootPart")
        if targetHum and targetHum.Health > 0 and targetRoot then
            local d = (targetRoot.Position - root.Position).Magnitude
            if d < distance then
                best, distance = targetRoot, d
            end
        end
    end
    return best
end

while humanoid.Health > 0 do
    local target = nearestRoot()
    if target then
        local path = PathfindingService:CreatePath({AgentRadius = 2, AgentHeight = 5, AgentCanJump = true})
        local ok = pcall(function() path:ComputeAsync(root.Position, target.Position) end)
        if ok and path.Status == Enum.PathStatus.Success then
            local waypoints = path:GetWaypoints()
            local nextPoint = nil
            for _, waypoint in ipairs(waypoints) do
                if (waypoint.Position - root.Position).Magnitude > 2.5 then
                    nextPoint = waypoint
                    break
                end
            end
            if nextPoint then
                if nextPoint.Action == Enum.PathWaypointAction.Jump then
                    humanoid.Jump = true
                end
                humanoid:MoveTo(nextPoint.Position)
            else
                humanoid:MoveTo(target.Position)
            end
        else
            -- Если путь не найден, попробуем подойти напрямую.
            humanoid:MoveTo(target.Position)
        end
    end
    task.wait(REPATH_DELAY)
end

3. Проверьте в игре

Нажмите Play в Roblox Studio и проверьте действие механики. Если механика не работает, откройте окно Output и проверьте тип скрипта, его расположение и названия объектов.

Ваш прогресс

Когда проверите механику в Roblox Studio, отметьте практику как выполненную. Отметка хранится только в этом браузере, не в личном кабинете.

Если объединяете несколько скриптов

Добавляйте механики по одной и проверяйте окно Output. Не создавайте несколько одинаковых систем монет или интерфейсов; скрипты, меняющие WalkSpeed, прыжок или освещение, могут влиять друг на друга.

⭐ Три шага к собственной игре
1. Повторите и измените

Поменяйте RANGE с 60 на 30.

2. Улучшите

Измените WalkSpeed с 15 на 10 и сравните сложность погони.

3. Придумайте своё

Создайте игру «Убегите от робота», добавив безопасные зоны и чекпоинты.

4. Проверьте себя

Как NPC выбирает цель для преследования?

🛠 Если не работает

Проверьте имя ChaserNPC, Humanoid и HumanoidRootPart, отсутствие Anchored у частей NPC. Для поиска пути оставляйте проходы достаточной ширины. Откройте Output: если PathfindingService не находит путь, NPC попробует идти напрямую.