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 в 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)
end3. Проверьте в игре
Нажмите Play в Roblox Studio и проверьте действие механики. Если механика не работает, откройте окно Output и проверьте тип скрипта, его расположение и названия объектов.
Когда проверите механику в Roblox Studio, отметьте практику как выполненную. Отметка хранится только в этом браузере, не в личном кабинете.
Добавляйте механики по одной и проверяйте окно Output. Не создавайте несколько одинаковых систем монет или интерфейсов; скрипты, меняющие WalkSpeed, прыжок или освещение, могут влиять друг на друга.
Поменяйте RANGE с 60 на 30.
Измените WalkSpeed с 15 на 10 и сравните сложность погони.
Создайте игру «Убегите от робота», добавив безопасные зоны и чекпоинты.
4. Проверьте себя
Как NPC выбирает цель для преследования?
Проверьте имя ChaserNPC, Humanoid и HumanoidRootPart, отсутствие Anchored у частей NPC. Для поиска пути оставляйте проходы достаточной ширины. Откройте Output: если PathfindingService не находит путь, NPC попробует идти напрямую.