К карте
АРХИПЕЛАГ · ROBLOX · КИНО 3
Абордажный удар
0
Прогресс0 / 5
ПОСТАВЬ ПЕРВУЮ ДЕТАЛЬ

Нажми — и деталь появится в мире

Жми кнопки по очереди — это три строчки настоящего скрипта.
ПЕРЕД СТАРТОМ
⏱ Сколько займёт
30–50 минут, 5 шагов. Каждый шаг заканчивается результатом на экране.
💻 Что нужно
Компьютер с Windows или macOS. Понадобится Roblox Studio — бесплатная, поставим на первом шаге. С телефона этот квест не проходится.
⏸ Если прервёшься
Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
🎓 Чему научишься
клавиши и LocalScript · кулдаун · клиент и сервер
ШАГ 1 ИЗ 5 · АРХИПЕЛАГ · ROBLOX · КИНО 3

Анимация по команде игрока

ЧТО ПРОИСХОДИТ
ЭПИЗОД 16Абордажная палуба

Боцман Клык встаёт напротив и складывает руки: «Ну, ударь».

Ты жмёшь кнопку — герой машет. Клык не впечатлён: «Слишком часто. Так победит тот, кто быстрее долбит по клавише».

Между ударами нужна пауза. Она превращает мельницу руками в честный бой.

боцман Клык · старший на палубе
ЧТО ПОЛУЧИТСЯ
ЗАПИСЬ ГОТОВОЙ ИГРЫ
После удара полоска кулдауна тает, и пока она не полна — «жмёшь рано, нельзя!». Пауза превращает мельницу руками в честный бой.

Это запись из Roblox Studio: удар по клавише и пауза между ударами — ровно то, что ты сделаешь за этот квест. Полоска на экране — просто подсказка для записи, рисовать её не обязательно.

СНАЧАЛА — ПОСМОТРИ
ЖИВАЯ ЗАПИСЬ ДВИЖКА
Нажал клавишу — персонаж бьёт. Анимация связана с действием игрока, а не играет сама по себе.

До сих пор анимации включались автоматически. Сегодня их будет запускать человек.

КАПИТАН КВЕСТО · ВЕДУЩИЙ КВЕСТА
Здесь появляется важное различие. Скрипт на сервере видят все игроки — он общий. Скрипт на клиенте (LocalScript) работает у каждого игрока в его собственном экране.

Нажатие клавиши — дело личное: сервер не знает, что ты нажал F. Значит, ловить клавиши обязан LocalScript, и положим мы его в StarterPlayer → StarterCharacterScripts: оттуда Roblox кладёт копию скрипта прямо в персонажа — и после каждого возрождения удар работает заново.

ЗАДАНИЕ 1 · АНИМАЦИЯ УДАРА
КЛИЕНТ И СЕРВЕР — ЖМИ НА КРУЖОКнажми на кружок — покажу место
HOMEMODELAVATARTESTVIEWPLUGINSPartTerrainMaterialToolboxPublishPlayExplorerWorkspaceBaseplateSpawnLocationTerrainLightingServerScriptServicePropertiesAnchored✔MaterialWoodColorTransparency0Size4, 1, 8
  • 1StarterPlayer → StarterCharacterScriptsСюда кладут LocalScript — он работает у каждого игрока отдельно и заново запускается после каждого возрождения. Клавиши ловит только он.
  • 2ПКМ → Insert Object → LocalScriptНазови PunchOnKey. Обычный Script здесь не сработает: сервер не знает, что ты нажал F.
  • 3Проверь: Play → клавиша FУдар должен идти один раз на нажатие. Долбит без остановки — не хватает кулдауна.
  • 4RemoteEvent — чтобы удар видели всеВ ReplicatedStorage положи RemoteEvent. Клиент просит, сервер решает — золотое правило.
Отмечено:0 из 4

Обрати внимание: удар не зациклен. Зацикленная анимация удара выглядела бы как мельница.

ШАГ 2 ИЗ 5 · АРХИПЕЛАГ · ROBLOX · КИНО 3

Ловим клавишу

ЗАДАНИЕ 2 · КОД
PunchOnKey (LocalScript в StarterCharacterScripts)LUA
local UserInputService = game:GetService("UserInputService")

local character = script.Parent                 -- скрипт лежит внутри персонажа
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or Instance.new("Animator", humanoid)

local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://9093241065"  -- свой ID

local punch = animator:LoadAnimation(animation)

UserInputService.InputBegan:Connect(function(input, processed)
	if processed then return end          -- игрок печатает в чате — не мешаем
	if input.KeyCode == Enum.KeyCode.F then
		punch:Play()
	end
end)
UserInputService — служба, которая слышит клавиши, мышь и касания экрана. InputBegan срабатывает в момент нажатия. Аргумент processed говорит, «съел» ли это нажатие интерфейс: если игрок печатает в чате, буква F не должна бить. Скрипт лежит в StarterPlayer → StarterCharacterScripts: Roblox кладёт его копию внутрь персонажа при каждом появлении, поэтому script.Parent — это персонаж, а после смерти дорожка создаётся заново и удар не пропадает.

Запусти и нажми F. Персонаж ударит.

Зачем в коде строка if processed then return end?
Чтобы удар не срабатывал, когда игрок печатает в чате
Чтобы ускорить скрипт
Это обязательная строка в любом LocalScript
НАСТОЯЩИЙ ЭКРАН ROBLOX STUDIO — КУДА НАЖИМАТЬ
ТВОЙ ЭКРАН ROBLOX STUDIO — КУДА НАЖИМАТЬнажми на кружок — покажу место
Окно редактора
  • 1StarterPlayer — разверни, внутри StarterPlayerScriptsЖми треугольник слева от строки: раскроются StarterPlayerScripts и StarterCharacterScripts. LocalScript с клавишей F кладут в первую. В ServerScriptService он не заругается — он просто промолчит, и это самая обидная ошибка новичка.
  • 2ReplicatedStorage — единственная общая папкаЕё видят и клиент, и сервер. Наведи на строку → «+» → RemoteEvent, назови PunchEvent. Это мост: клиент кричит FireServer, сервер слышит OnServerEvent.
  • 3ServerScriptService — обычный Script для всехОн ловит сигнал и включает анимацию удара так, чтобы её увидели остальные игроки. Правило на всю жизнь: клиент просит, сервер решает.
  • 4Синий треугольник ▶ — проверь клавишу FУдар должен идти один раз на нажатие. Долбит без остановки — не хватает кулдауна: флажок canPunch и task.wait(0.8).
  • 5Вкладка Script — окно OutputВкладки View в этой Studio нет, Output открывают отсюда. Красная строка назовёт скрипт и номер строки — читай до конца, там уже написан ответ.
Отмечено:0 из 5

Это настоящий экран Roblox Studio 2026 — такой же, как у тебя: та же лента вкладок, тот же Explorer со всеми сервисами, та же панель Properties. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно. Чего на кадре нет — про то честно написано словами. Отмечай пройденное — прогресс сохранится.

ШАГ 3 ИЗ 5 · АРХИПЕЛАГ · ROBLOX · КИНО 3

Чтобы не спамили

ЗАДАНИЕ 3 · ПЕРЕЗАРЯДКА
PunchOnKey — замени прежний блок InputBeganLUA
local canPunch = true

UserInputService.InputBegan:Connect(function(input, processed)
	if processed then return end
	if input.KeyCode ~= Enum.KeyCode.F then return end
	if not canPunch then return end     -- ещё не перезарядились

	canPunch = false
	punch:Play()
	task.wait(0.8)                      -- пауза между ударами
	canPunch = true
end)
Не дописывай снизу. Этот кусок заменяет прежний блок UserInputService.InputBegan:Connect(...) целиком — оставишь оба, и первый по-прежнему будет бить без паузы. Приём называется кулдаун. Переменная-флажок canPunch закрывается на время удара и открывается обратно. Без него игрок задолбит клавишу и получит дёргающуюся кашу вместо анимации. Знак ~= в Lua означает «не равно».

Кулдаун есть в каждой игре, где что-то можно нажимать: удар, выстрел, способность, прыжок. Запомни этот приём — пригодится всюду.

А ЕСЛИ ИГРОК НА ТЕЛЕФОНЕ
Клавиши F у него нет. Для мобильных Roblox умеет рисовать кнопку сам:

local CAS = game:GetService("ContextActionService")

local function onPunch(_, state)
   if state ~= Enum.UserInputState.Begin then return end
   if not canPunch then return end
   canPunch = false
   punch:Play()
   task.wait(0.8)
   canPunch = true
end

CAS:BindAction("Punch", onPunch, true, Enum.KeyCode.F)


Третий аргумент true и означает «покажи кнопку на сенсорном экране». Проверка state ~= Enum.UserInputState.Begin обязательна: без неё действие сработает и на нажатие, и на отпускание — удар пойдёт дважды.
ЭКСКУРС
КАК В НАСТОЯЩИХ ИГРАХ

Почему удар нельзя жать без конца

Пауза между ударами — кулдаун — существует в каждой боевой игре. Без неё побеждает тот, у кого быстрее палец, а не тот, кто лучше играет.

Второе назначение паузы — читаемость: противник должен успеть увидеть замах и среагировать. Бой без пауз выглядит как каша.

Профессионалы делят удар на три части: замах, попадание, возврат. Игрок реагирует на замах — и это делает бой честным.

ШАГ 4 ИЗ 5 · АРХИПЕЛАГ · ROBLOX · КИНО 3

Удар, который виден всем

КАПИТАН КВЕСТО · ВЕДУЩИЙ КВЕСТА
Есть подвох. Анимацию своего персонажа клиент показывает и остальным — но сервер о твоём ударе не знает. А засчитать попадание, снять здоровье и проверить, не жмёшь ли ты клавишу чаще, чем можно, имеет право только он.

Поэтому клиент только просит: «я ударил», а сервер сам проверяет паузу и включает удар. Передают такие сообщения через RemoteEvent.

ЗАДАНИЕ 4 · ДЛЯ ВСЕХ
два скриптаLUA
-- ReplicatedStorage → RemoteEvent с именем PunchEvent

-- В LocalScript, вместо punch:Play():
game.ReplicatedStorage.PunchEvent:FireServer()

-- В Script (ServerScriptService):
local ev = game.ReplicatedStorage:WaitForChild("PunchEvent")

local COOLDOWN = 0.8
local lastHit = {}                       -- когда игрок бил в прошлый раз
local tracks = {}                        -- готовая дорожка на каждого

ev.OnServerEvent:Connect(function(player)
	local now = os.clock()
	if lastHit[player] and now - lastHit[player] < COOLDOWN then return end
	lastHit[player] = now               -- кулдаун считает сервер, а не клиент

	local character = player.Character
	if not character then return end
	local humanoid = character:WaitForChild("Humanoid")
	local animator = humanoid:FindFirstChildOfClass("Animator") or Instance.new("Animator", humanoid)

	local track = tracks[character]
	if not track then                  -- дорожку грузим один раз
		local animation = Instance.new("Animation")
		animation.AnimationId = "rbxassetid://9093241065"
		track = animator:LoadAnimation(animation)
		tracks[character] = track
	end

	track:Play()
end)
FireServer — «эй, сервер, случилось вот что». OnServerEvent — «сервер слушает». Первым аргументом сервер всегда получает игрока, который прислал сообщение — это Roblox добавляет сам, подделать нельзя. Паузу считает сервер: клиент может слать FireServer хоть сто раз в секунду — пока не прошёл COOLDOWN, сервер просто ничего не сделает. И дорожку мы грузим один раз на персонажа, а не заново на каждый удар.

Это фундамент любой многопользовательской игры. Всё, что должны видеть другие, проходит через сервер.

Почему нельзя доверять клиенту в таких сообщениях?
Клиент работает на компьютере игрока, и его можно переделать — сервер обязан проверять
Клиент слишком медленный
Клиенту можно доверять полностью
ШАГ 5 ИЗ 5 · АРХИПЕЛАГ · ROBLOX · КИНО 3

Свои три действия

ЗАДАНИЕ 5 · ФИНАЛЬНОЕ
1
Придумай три действия
Удар, приветствие, «сесть отдохнуть». Или свои — что подходит твоей игре.
2
Сделай анимации
Короткие, читаемые, с замахом.
3
Повесь на разные клавиши
F, G, H. Или через ContextActionService, чтобы работало и на телефоне.
4
Каждому — свой кулдаун
Удару короткий, отдыху длинный. Разница в ощущениях будет заметна.

Набор из трёх действий на клавишах — это уже система управления персонажем. В играх такое называют «мувсет».

КАПИТАН КВЕСТО · ВЕДУЩИЙ КВЕСТА
Ты связал анимацию с действием игрока и разобрался, чем клиент отличается от сервера. Это то место, где заканчивается «делаю красиво» и начинается настоящая разработка игр.

Задание Гильдии: сделай так, чтобы после удара из кулака вылетала искра — ParticleEmitter с коротким Lifetime. Эффект в момент действия работает как восклицательный знак.

Поднимай флаг.

Квест пройден!

Анимация по клавише, кулдаун и передача действия всем игрокам. Бейдж БОЕЦ.

Что дальше. Солнце садится, и капитан вдруг останавливает тебя рукой: «Стой. Смотри».

🏅 Забрать диплом Следующий квест: Кино на закате
🔒

Этот остров ещё закрыт

Сначала пройди предыдущий квест — хотя бы просмотри все шаги.

⚑ Экспедиционный режим