Передвижение NPC
Сегодня мы с вами разберемся, как создать для нашего NPC
путь, по которому он будет передвигаться, установим для нашего персонажа поведение и рассмотрим его характеристики.
1. Для начала добавим объект Part и назовем его Waypoint
Объект может быть похож на флаг или на другой объект, до
которого будет идти персонаж.
2. Теперь добавим NPC скрипт, в скрипте нужно прописать
следующее:
local Humanoid = script.Parent.Humanoid
local Path = workspace.Waypoint.Position
Humanoid:MoveTo(Path)
Humanoid.MoveToFinished:Wait()
Объяснение
local Humanoid = script.Parent.Humanoid – Путь до NPC
local Path = workspace.Waypoint.Position – Путь до Waypoint’a
Humanoid:MoveTo(Path) – В этой части мы указываем, куда
должен дойти Humanoid. В нашем случае это переменная
Path, то есть путь до Waypoint’a
Humanoid.MoveToFinished:Wait() – Это часть кода ждет, пока
персонаж завершит свой путь до первого Waypoint’a
прежде чем начать движение ко второму
Важно! Для NPC нужно отключить Anchored, иначе он
может остаться на месте.
Давайте добавим ещё несколько Waypoint’ов (2-3), чтобы наш
NPC начал патрулировать окрестности.
1. Продублируем уже готовый Waypoint и добавим в названии
цифры. Например: Waypoint1, Waypoint2 и тд.
2. Добавим в скрипт Waypoint’ы:
Характеристики NPC
Поиск пути
На наших объектах отобразятся вот такие стрелки
Это возможные пути для NPC, а фиолетовая поверхность – это,
поверхность по которой NPC может передвигаться.
Если на вашем пути встречаются вот такие разрывы,
попробуйте переместить объект ближе тогда стрелки пути
появятся и можно точно утверждать, что NPC сможет
правильно найти путь.
Теперь галочку Show Navigation Mesh можно отключить.
Давайте добавим скрипт и проверим
Создайте скрипт в NPC. Скрипт:
local pathfindingService = game:GetService("PathfindingService")
local humanoid = script.Parent.Humanoid
local body = script.Parent:FindFirstChild("HumanoidRootPart") or script.Parent:FindFirstChild("UpperTorso")
local destination = game.Workspace.Waypoint1.Position -- путь до точки
local path = pathfindingService:CreatePath()
path:ComputeAsync(body.Position, destination)
local waypoints = path:GetWaypoints()
for k, waypoints in pairs(waypoints) do
humanoid:MoveTo(waypoints.Position)
if waypoints.Action == Enum.PathWaypointAction.Jump then
humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
end
humanoid.MoveToFinished:Wait()
end