Подвійний стрибок у Роблокс: скрипт і пояснення для новачків
Зробимо так, щоб персонаж міг стрибнути вдруге просто в повітрі — з клавіатури, телефона чи геймпада. Один LocalScript у StarterCharacterScripts, стани Humanoid і подія JumpRequest.
- Працює з клавіатурою, телефоном і геймпадом
- Потрійний стрибок — зміною одного числа
- Кожен рядок коду з коментарем українською
Покроково
Знайди StarterCharacterScripts
В Explorer розгорни StarterPlayer і знайди папку StarterCharacterScripts. Скрипти звідси Roblox автоматично копіює всередину персонажа щоразу, коли він з’являється у світі, тож після смерті й відродження подвійний стрибок працюватиме знову.
Створи LocalScript
Наведи курсор на StarterCharacterScripts, натисни «+» і вибери LocalScript. Перейменуй його на DoubleJump, щоб потім легко знайти. Саме LocalScript: натискання клавіш і рух свого персонажа обробляються на пристрої гравця.
Встав код
Скопіюй перший скрипт нижче в DoubleJump. На початку є три налаштування: кількість стрибків у повітрі, пауза перед другим стрибком і його сила. Спершу нічого не змінюй — переконайся, що все працює.
Протестуй
Натисни Play (F5), стрибни пробілом і, поки персонаж у повітрі, натисни пробіл ще раз. Персонаж має підстрибнути вдруге. На телефоні так само працює кнопка стрибка на екрані, а на геймпаді — кнопка A.
Подивись стани персонажа
Щоб зрозуміти, що відбувається, додай у StarterCharacterScripts другий LocalScript із блоку нижче. Він друкує у вікні Output кожну зміну стану: Running, Jumping, Freefall, Landed. Якщо Output не видно, увімкни його в меню Studio.
Налаштуй механіку
Зміни MAX_AIR_JUMPS на 2 — отримаєш потрійний стрибок. AIR_JUMP_MULTIPLIER = 1.3 зробить другий стрибок вищим. Якщо другий стрибок спрацьовує занадто швидко, збільш TIME_BEFORE_AIR_JUMP до 0.25–0.3 секунди.
Скрипт
-- LocalScript: поклади в StarterPlayer > StarterCharacterScripts
local UserInputService = game:GetService("UserInputService") -- сервіс введення: клавіатура, екран, геймпад
local character = script.Parent -- Roblox копіює цей скрипт всередину персонажа
local humanoid = character:WaitForChild("Humanoid") -- керує рухом, стрибками й здоров’ям персонажа
-- Налаштування
local MAX_AIR_JUMPS = 1 -- скільки стрибків можна зробити в повітрі (1 = подвійний стрибок)
local TIME_BEFORE_AIR_JUMP = 0.2 -- мінімальна пауза після першого стрибка, секунди
local AIR_JUMP_MULTIPLIER = 1.1 -- сила стрибка в повітрі (1 = як звичайний стрибок)
local airJumpsUsed = 0 -- скільки стрибків у повітрі вже використано
local canAirJump = false -- чи можна зараз стрибнути в повітрі
-- Запам’ятовуємо звичайну силу стрибка
local defaultJumpPower = humanoid.JumpPower
local defaultJumpHeight = humanoid.JumpHeight
-- Змінює силу стрибка. Roblox бере JumpPower або JumpHeight залежно від UseJumpPower
local function setJumpMultiplier(multiplier)
if humanoid.UseJumpPower then
humanoid.JumpPower = defaultJumpPower * multiplier
else
humanoid.JumpHeight = defaultJumpHeight * multiplier
end
end
-- Стежимо за кожною зміною стану персонажа
humanoid.StateChanged:Connect(function(_oldState, newState)
if newState == Enum.HumanoidStateType.Landed
or newState == Enum.HumanoidStateType.Running
or newState == Enum.HumanoidStateType.Climbing
or newState == Enum.HumanoidStateType.Swimming then
-- Персонаж знову має опору: обнуляємо лічильник і повертаємо звичайний стрибок
airJumpsUsed = 0
canAirJump = false
setJumpMultiplier(1)
elseif newState == Enum.HumanoidStateType.Freefall then
-- Персонаж у повітрі: трохи чекаємо, щоб одне натискання не зарахувалося двічі
task.wait(TIME_BEFORE_AIR_JUMP)
if humanoid:GetState() == Enum.HumanoidStateType.Freefall then
canAirJump = true -- персонаж досі в повітрі, тож стрибок дозволено
end
end
end)
-- JumpRequest спрацьовує від пробілу, кнопки стрибка на телефоні та кнопки A на геймпаді
UserInputService.JumpRequest:Connect(function()
if not canAirJump or airJumpsUsed >= MAX_AIR_JUMPS then
return -- стрибати в повітрі зараз не можна
end
if humanoid:GetState() == Enum.HumanoidStateType.Dead then
return -- персонаж загинув, нічого не робимо
end
canAirJump = false -- debounce: JumpRequest може прийти кілька разів за одне натискання
airJumpsUsed += 1 -- рахуємо використаний стрибок
setJumpMultiplier(AIR_JUMP_MULTIPLIER) -- трохи посилюємо стрибок у повітрі
humanoid:ChangeState(Enum.HumanoidStateType.Jumping) -- змушуємо персонажа стрибнути ще раз
end)
-- LocalScript для перевірки: поклади в StarterPlayer > StarterCharacterScripts
-- Показує у вікні Output кожну зміну стану персонажа
local character = script.Parent -- персонаж, у якого скопійовано скрипт
local humanoid = character:WaitForChild("Humanoid") -- чекаємо, поки завантажиться Humanoid
humanoid.StateChanged:Connect(function(oldState, newState)
-- .Name перетворює значення Enum на текст, наприклад "Freefall"
print(oldState.Name .. " -> " .. newState.Name)
end)
Не працює? Типові помилки
Перевір, що це LocalScript, а не Script, і що він лежить саме в StarterCharacterScripts. Якщо покласти його в StarterPlayerScripts, script.Parent буде не персонажем, і рядок з WaitForChild("Humanoid") чекатиме вічно.
JumpRequest може надходити кілька разів за одне натискання. Збільш TIME_BEFORE_AIR_JUMP до 0.25–0.3, щоб між першим і другим стрибком була помітна пауза.
Так задумано: стан Freefall настає і після стрибка, і під час падіння. Щоб дозволити стрибок у повітрі лише після звичайного стрибка, заведи змінну, яка стає true, коли newState дорівнює Jumping, і перевіряй її в JumpRequest.
Персонажем гравця «володіє» його пристрій (network ownership), тому ChangeState треба викликати з LocalScript. Серверний Script може змінювати стан лише тих гуманоїдів, якими володіє сервер.
Подвійний стрибок у Роблокс: як працює скрипт
Подвійний стрибок — класика платформерів і obby: гравець стрибає, а потім ще раз відштовхується просто в повітрі. У Roblox такої функції немає «з коробки», але подвійний стрибок у Роблокс робиться одним скриптом. Ось як він працює:
- Скрипт стежить за станом персонажа через подію Humanoid.StateChanged.
- Коли персонаж у повітрі (стан Freefall) і минула коротка пауза, скрипт дозволяє стрибок у повітрі.
- Подія UserInputService.JumpRequest повідомляє, що гравець натиснув стрибок: пробіл, кнопку на екрані чи на геймпаді.
- Якщо стрибок дозволено, викликаємо Humanoid:ChangeState зі станом Jumping — і персонаж стрибає вдруге.
- Після приземлення (стан Landed) лічильник обнуляється.
Уся логіка вміщується в один LocalScript з коментарями українською. Досвід потрібен мінімальний: якщо ти вже створював деталі й скрипти в Roblox Studio, упораєшся.
Стани Humanoid простими словами
Humanoid — це об’єкт усередині персонажа, який керує рухом, здоров’ям і стрибками. У кожен момент він перебуває в одному зі станів (Enum.HumanoidStateType). Для подвійного стрибка важливі чотири:
- Running — персонаж на землі: біжить або навіть стоїть на місці;
- Jumping — момент відштовхування від землі;
- Freefall — персонаж у повітрі: летить угору після стрибка або падає;
- Landed — щойно приземлився.
Подія StateChanged передає два значення: старий і новий стан. Нам потрібен лише новий, тому перший параметр названо _oldState — підкреслення на початку підказує, що змінна не використовується. Метод GetState повертає поточний стан, а ChangeState змушує Humanoid перейти в інший. Саме ним ми запускаємо другий стрибок: персонаж ніби знову відштовхується, хоча під ногами нічого немає.
Ще ми скидаємо лічильник, коли персонаж починає лізти драбиною (Climbing) чи плисти (Swimming): у таких випадках стану Landed може не бути.
Чому LocalScript і чому StarterCharacterScripts
Натискання клавіш відбуваються на пристрої гравця, тому UserInputService працює в LocalScript. Крім того, клієнт «володіє» фізикою свого персонажа (це називається network ownership), тож саме з LocalScript виклик ChangeState спрацьовує надійно — так прямо сказано в документації Roblox.
Папку StarterCharacterScripts обрано не випадково: Roblox копіює її вміст у кожного нового персонажа. Тому script.Parent — це сам персонаж, а character:WaitForChild("Humanoid") чекає, поки Humanoid завантажиться. Після смерті персонаж створюється заново разом зі свіжою копією скрипта, і всі змінні починають з нуля.
Ще одна деталь із документації: JumpRequest може спрацювати кілька разів за одне натискання. Тому в коді є два захисти: пауза TIME_BEFORE_AIR_JUMP після переходу у Freefall і змінна canAirJump, яка одразу стає false, щойно стрибок використано. Це той самий debounce, що й у туторіалі про двері.
Як розвинути механіку: ідеї для практики
- Потрійний стрибок — просто зміни MAX_AIR_JUMPS на 2.
- Ефект у повітрі. Додай у HumanoidRootPart об’єкт ParticleEmitter і викликай його метод Emit під час другого стрибка — під ногами з’явиться хмаринка.
- Звук стрибка. Додай Sound у персонажа й викликай sound:Play() у момент ChangeState.
- Бонус за предмет. Дозволяй подвійний стрибок лише після того, як гравець підібрав особливий предмет на рівні.
- Витривалість. Кожен стрибок у повітрі витрачає «енергію», яка відновлюється на землі, — і вже потрібен інтерфейс зі смужкою.
Важливо: це клієнтський скрипт, тому досвідчений читер теоретично може змінити його на своєму пристрої. Для навчального проєкту це не проблема, але у великих іграх розробники додають перевірки на сервері. Це вже тема для наступного рівня.
Для батьків: що дитина вивчає на цьому прикладі
У кількох десятках рядків коду — одразу кілька важливих тем: події й функції, логічні умови, лічильники, стан програми, різниця між клієнтом і сервером. Це ті самі ідеї, з якими працюють професійні розробники ігор, тільки в зрозумілій для дитини формі: натиснув пробіл — побачив результат.
Самостійно такі туторіали добре повторювати, але справжнє розуміння приходить тоді, коли дитина змінює код під власну ідею й розбирається, чому щось не працює. Саме цього ми вчимо на індивідуальних уроках Excklusive-IT: 60 хвилин у Zoom з одним наставником, українською або англійською, для дітей 8–17 років.
Хочете, щоб ваша дитина створювала повноцінні ігри з власними механіками? Перший урок 1-на-1 — безкоштовно. Запишіться на сторінці безкоштовного уроку або перегляньте курс Roblox Studio. А якщо дитина тільки починає, радимо спершу прочитати гайд «Як зробити гру в Роблокс».
Питання, які ставлять батьки
Чи працює подвійний стрибок на телефоні?
Так. Подія JumpRequest спрацьовує від будь-якого способу стрибка: пробілу на клавіатурі, кнопки стрибка на екрані телефона чи планшета й кнопки A на геймпаді. Тому окремо обробляти кожен пристрій не потрібно — скрипт працює всюди однаково.
Як зробити потрійний стрибок?
Зміни значення MAX_AIR_JUMPS з 1 на 2. Лічильник airJumpsUsed рахує стрибки в повітрі й обнуляється після приземлення, тож персонаж зможе відштовхнутися в повітрі двічі. Після цього перевір свої рівні: деякі перешкоди можуть стати занадто легкими.
Чи працює скрипт для аватарів R6 і R15?
Так. Скрипт працює з Humanoid і його станами, а вони однакові для обох типів аватарів. Відрізняються лише анімації та будова тіла, яких цей код не зачіпає, тож нічого змінювати не потрібно.
Навіщо в коді перевірка UseJumpPower?
Roblox використовує одну з двох властивостей залежно від UseJumpPower: якщо вона true, сила стрибка задається через JumpPower, якщо false — через висоту JumpHeight. Функція setJumpMultiplier перевіряє це й змінює потрібну властивість, тож скрипт працює за будь-яких налаштувань гри.
Де знайти офіційну документацію?
На сайті create.roblox.com у розділі Engine API: сторінки UserInputService (подія JumpRequest), Humanoid (StateChanged, GetState, ChangeState) і Enum.HumanoidStateType. Документація англійською, але з прикладами коду, які легко зрозуміти, якщо ти вже пройшов цей туторіал.
Від одного стрибка — до власного платформера
Безкоштовний перший урок 1-на-1: 60 хвилин у Zoom, Roblox Studio та Luau українською або англійською. Для дітей 8–17 років.
Записатися на безкоштовний урокЗапишіться на безкоштовний урок
Без зобовʼязань. Без оплати. Просто перший урок для вашої дитини.
Або напишіть нам напряму
Натисніть на месенджер — чат відкриється з готовим привітанням.
- +1 (289) 44-28-698
- excklusiveit@gmail.com
-
Години роботи — Гамільтон, Онтаріо (ET) Пн–Пт: 9:00–18:00 Сб–Нд: 8:00–16:00
- Онлайн по всьому світу · клас у Гамільтоні: 170 Parkdale Ave N, Hamilton, ON L8H 5X2