Роблокс Луа Гуманоид: Движение

Простите нубский вопрос, я новичок в Roblox LUA.

Я пытаюсь заставить гуманоида двигаться вперед и назад (например, когда офицер охраняет периметр, двигаясь туда-сюда), но с этим сценарием может быть что-то не так, потому что он движется только вперед.

local toggle = true
local RunService = game:GetService("RunService")
local humanoid = game.Players.LocalPlayer.Character:WaitForChild("Humanoid")

RunService:BindToRenderStep("Move", Enum.RenderPriority.Character.Value + 1, function()
   while toggle do
       humanoid:Move(Vector3.new(0, 0, -1), true)
       wait(1)
       humanoid:Move(Vector3.new(0, 0, 1), true)
       wait(1)
   end
end)

И потом, когда я переключаю = false, это не останавливается.

Я не могу использовать нажатие клавиши, так как это противоречит цели того, что я собираюсь сделать.

Спасибо за любую помощь.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Структура этого кода не имеет особого смысла. Вы создаете цикл внутри функции, которая запускается каждый кадр. В каждом отдельном кадре вы создаете новый цикл... Всего через 10 секунд у вас может быть 300 циклов, пытающихся переместить гуманоида одновременно.

Поскольку циклы постоянно перезаписывают друг друга, последний из них имеет приоритет ... Вероятно, поэтому он работает только в одном направлении.

Я предполагаю, что вы хотите, чтобы персонаж двигался к (0,0,-1) в течение секунды, затем к (0,0,1) еще одну секунду, а затем, если переключатель включен, снова бежать.

Вместо этого вы должны не создавать цикл внутри BindToRenderStep, а задавать движение каждый кадр в соответствии с тем, куда должен двигаться персонаж, и запускать этот цикл снаружи один раз:

local toggle = true
local RunService = game:GetService("RunService")
local humanoid = game.Players.LocalPlayer.Character:WaitForChild("Humanoid")

movement = nil

RunService:BindToRenderStep("Move", Enum.RenderPriority.Character.Value + 1, function()
   if movement then
       humanoid:Move(movement, true)
   end
end)

while toggle do
    movement = Vector3.new(0, 0, -1)
    task.wait(1)
    movement = Vector3.new(0, 0, 1)
    task.wait(1)
end
movement = nil

Имейте в виду, что этот код имеет некоторые особенности:

  • Ничто не сможет работать через некоторое время, поэтому ничто не отключит переключатель, если его поместить после while toggle do. Это зависит от того, где вы хотите переключить переключатель, как вы справитесь с этим.
  • В зависимости от того, где вы разместили это, это может привести к ошибке. Если это в StarterPlayerScripts, вы должны использовать событие CharacterAdded, чтобы дождаться, пока персонаж не появится, а затем снова обработать настройку гуманоида при возрождении (поскольку гуманоид не будет тем же самым, если персонаж возродится). Если это в StarterCharacterScripts, нет необходимости обращаться к LocalPlayer, вы можете просто сделать script.Parent:WaitForChild("Humanoid") (хотя это также зависит от личных предпочтений).
  • Вы сделали движение относительно камеры с помощью этого true аргумента :Move()https://create.roblox.com/docs/reference/engine/classes/Humanoid#Move. Игрок по-прежнему сможет перемещать камеру, чтобы изменить направление движения.

Аймарекин, скрипт не работал, сначала двигался только вперёд. но, черт возьми, сценарий и четкое логическое объяснение, которое вы предоставили, помогли мне еще больше понять движение персонажа. Поместив 'movement =' в каждый вектор, я смог заставить гуманоида двигаться в любом направлении. Спасибо большое за то, что делитесь своими знаниями, мой добрый человек!

Paul Crevase 02.02.2023 15:24

@PaulCrevase О, я понимаю, почему он не изменил направления, я забыл добавить movement = Vector3.new(0,0,1) в цикл, когда создаю второй вектор. Я исправил ответ, но рад слышать, что это сработало

Aimarekin 02.02.2023 22:25

Спасибо @Aimarekin. Когда я устанавливаю переключатель = false, он не останавливается. У вас есть идея, как его развязать? Я попробовал UnbindToRenderStep, но это не сработало.

Paul Crevase 03.02.2023 03:40

Другие вопросы по теме