Нужно написать код lua для роблокс студио который ...
Erstellt am: 29. Mai 2025
Erstellt am: 29. Mai 2025
Нужно написать код lua для роблокс студио который будет вставлен в НПС, в коде НПС будет преследовать ближайшего игрока, и если НПС застрянет на месте или не дойдет к игроку и будет проверять правильной путь и опять идти к ближайшему игрока
Вот пример готового скрипта (Lua) для NPC в Roblox Studio.
Скрипт вставьте в ServerScriptService или внутрь самой модели-NPC (Script или LocalScript не нужен – только обычный Script на сервере).
NPC будет:
STUCK_TIME секунд, путь пересчитывается заново, и цикл повторяется.lua--[[ Скрипт «Охотник» для NPC Автор: ChatGPT (29.05.2025) ]] --------------------------------------------------------------------- -- НАСТРОЙКИ --------------------------------------------------------------------- local STUCK_TIME = 2 -- Секунд без движения до признания «застрял» local PATH_RETRY_DELAY = 0.1 -- Пауза между пересчётами local END_REACHED_DIST = 2 -- Считаем, что NPC дошёл до игрока --------------------------------------------------------------------- local npc = script.Parent -- Модель NPC local humanoid = npc:WaitForChild("Humanoid") local rootPart = npc:WaitForChild("HumanoidRootPart") local PathService = game:GetService("PathfindingService") local Players = game:GetService("Players") local RunService = game:GetService("RunService") --------------------------------------------------------------------- -- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ --------------------------------------------------------------------- local function getNearestCharacter() local nearestChar, nearestDist = nil, math.huge for _, plr in ipairs(Players:GetPlayers()) do local char = plr.Character if char and char:FindFirstChild("HumanoidRootPart") then local hrp = char.HumanoidRootPart if char:FindFirstChildOfClass("Humanoid").Health > 0 then local dist = (hrp.Position - rootPart.Position).Magnitude if dist < nearestDist then nearestDist, nearestChar = dist, char end end end end return nearestChar, nearestDist end local function follow(targetChar) if not targetChar or not targetChar:FindFirstChild("HumanoidRootPart") then return end local path = PathService:CreatePath({ AgentRadius = 2, AgentHeight = 5, AgentCanJump = true, WaypointSpacing = 2 }) path:ComputeAsync(rootPart.Position, targetChar.HumanoidRootPart.Position) if path.Status ~= Enum.PathStatus.Success then return end local waypoints = path:GetWaypoints() local wpIndex = 1 local stuckTime = 0 local lastPos = rootPart.Position -- Коллбек при блокировке пути local blockedConn blockedConn = path.Blocked:Connect(function(blockedIndex) if blockedIndex >= wpIndex then blockedConn:Disconnect() wpIndex = #waypoints + 1 -- прерываем цикл - вызовется пересчёт end end) -- Отслеживание перемещения и переход между точками local mover mover = RunService.Heartbeat:Connect(function(dt) if wpIndex > #waypoints then mover:Disconnect() return end local currentWP = waypoints[wpIndex] -- Проверка достижения текущей точки if (rootPart.Position - currentWP.Position).Magnitude < 1 then wpIndex += 1 local nextWP = waypoints[wpIndex] if nextWP then if nextWP.Action == Enum.PathWaypointAction.Jump then humanoid:ChangeState(Enum.HumanoidStateType.Jumping) end humanoid:MoveTo(nextWP.Position) end end -- Проверка «застрял?» if (rootPart.Position - lastPos).Magnitude < 0.1 then stuckTime += dt if stuckTime >= STUCK_TIME then mover:Disconnect() end else stuckTime = 0 end lastPos = rootPart.Position end) -- Стартовое движение if #waypoints > 0 then humanoid:MoveTo(waypoints[1].Position) end -- Ожидаем завершения перехода или прерывания while mover.Connected do if not targetChar.Parent or targetChar.Humanoid.Health <= 0 then mover:Disconnect() break -- цель умерла/удалена end if (rootPart.Position - targetChar.HumanoidRootPart.Position).Magnitude < END_REACHED_DIST then -- NPC дошёл до игрока – остановка (здесь можно добавить атаку) humanoid:MoveTo(rootPart.Position) mover:Disconnect() break end task.wait() -- освобождаем поток end if blockedConn.Connected then blockedConn:Disconnect() end end --------------------------------------------------------------------- -- ГЛАВНЫЙ ЦИКЛ --------------------------------------------------------------------- while task.wait(PATH_RETRY_DELAY) do local targetChar = getNearestCharacter() if targetChar then follow(targetChar) -- функция сама вернётся, если путь прервётся/застрянет end end
HumanoidHumanoidRootPartSTUCK_TIME – за сколько секунд «неподвижности» NPC считает себя застрявшим.END_REACHED_DIST – дистанция, при которой NPC считает, что «поймал» игрока (можно там запускать анимацию атаки).💡 Совет: если хотите добавить анимации или «урон» игроку – вставьте логику в блок, где проверяется расстояние
END_REACHED_DIST.