Мобильное управление: чтобы в твою игру можно было играть пальцем
Больше половины игроков Roblox — с телефона, а игру ты делаешь мышью на большом экране. Как добавить кнопки под палец, не сломав управление на компьютере и консоли.
Средне 20 минут проверен 42 дня назад
Что понадобится
Roblox Studio и понимание, чем LocalScript отличается от Script. Код в гайде готовый.
Текст гайда «Мобильное управление: чтобы в твою игру можно было играть пальцем»
Содержание
Самая частая причина, по которой хорошая игра не взлетает: автор играл в неё мышью. На телефоне выясняется, что действие висит на клавише E, кнопка размером в палец не помещается, а половину экрана закрывает собственный большой палец.
Разберём, как это чинится. Всё делается штатными средствами, ничего доустанавливать не нужно.
Что Roblox делает за тебя#
Хорошая новость: ходьбу и камеру платформа берёт на себя. На телефоне сама появляется виртуальная ручка слева и вращение камеры перетаскиванием справа, на геймпаде работают стики. Твоя задача — только действия: удар, прыжок с особым эффектом, взаимодействие, инвентарь.
Проверяй в эмуляторе, а не «на глаз»
В Studio есть вкладка Test → Device: она показывает игру в размерах телефона и включает сенсорное управление. Это не заменяет проверку на настоящем телефоне, но ловит девять проблем из десяти.
Определи устройство правильно#
Первая ошибка новичка — определять телефон по ширине экрана. Так планшет считается телефоном, а ноутбук с сенсорным экраном — компьютером. Правильный способ один: спросить у UserInputService, какие способы ввода вообще доступны.
local UserInputService = game:GetService("UserInputService")
local touch = UserInputService.TouchEnabled
local keyboard = UserInputService.KeyboardEnabled
local gamepad = UserInputService.GamepadEnabled
-- Телефон и планшет: касание есть, клавиатуры нет.
local isMobile = touch and not keyboard
-- Важно: устройство может быть сразу и тем, и другим.
-- Ноутбук с сенсорным экраном — это touch + keyboard,
-- и отбирать у него клавиши нельзя.Обрати внимание на последний комментарий. Правильная логика — не «или-или», а «и то, и другое»: клавиши работают всегда, а экранные кнопки просто появляются там, где есть касание.
Кнопка действия: делай через ContextActionService#
Можно нарисовать TextButton руками и повесить на него обработчик. Но тогда придётся отдельно писать то же самое для клавиатуры и отдельно для геймпада — три копии одного действия, которые рано или поздно разъедутся.
ContextActionService решает это одним вызовом: ты описываешь действие один раз и перечисляешь, чем его вызывают. Экранную кнопку он рисует сам, и только там, где нужно.
local ContextActionService = game:GetService("ContextActionService")
local Enum = Enum
local ACTION = "Attack"
local function onAttack(_, state)
-- Начало нажатия. Без этой проверки действие сработает
-- дважды: на нажатии и на отпускании.
if state ~= Enum.UserInputState.Begin then
return Enum.ContextActionResult.Pass
end
print("удар")
return Enum.ContextActionResult.Sink
end
-- true во втором аргументе = нарисовать экранную кнопку на телефоне.
ContextActionService:BindAction(
ACTION,
onAttack,
true,
Enum.KeyCode.E,
Enum.KeyCode.ButtonR2
)
ContextActionService:SetTitle(ACTION, "Удар")
ContextActionService:SetPosition(ACTION, UDim2.new(1, -140, 1, -140))Всё: на компьютере действие висит на E, на геймпаде — на правом триггере, на телефоне появилась кнопка. Логика написана один раз.
Размер и место кнопки#
Здесь начинается то, что не видно на большом экране. Палец — это не курсор: он толще и закрывает собой то, во что целится.
| Правило | Почему |
|---|---|
| Кнопка не меньше 44×44 точек | Меньше — палец промахивается, и человек винит игру, а не себя |
| Между кнопками зазор хотя бы 8 точек | Иначе одно нажатие задевает две кнопки сразу |
| Всё важное — в правой нижней четверти | Левый низ занят ручкой движения, верх экрана до большого пальца не достаёт |
| Ничего важного в самом верху | Там вырез камеры, часы и системная панель |
| Не больше четырёх кнопок сразу | Пятая уже не помещается под руку и закрывает игру |
Проверь на маленьком экране
Верстка, которая красиво лежит на большом телефоне, на узком экране складывается в кучу. В эмуляторе устройств выбери самый маленький из доступных — если работает там, работает везде.
Интерфейс: масштабируй, а не задавай в пикселях#
Второй источник мучений — окна, сделанные в жёстких пикселях. На компьютере окно ровно посередине, на телефоне занимает весь экран и уезжает за края.
- размеры задавай в долях:
UDim2.fromScale(0.4, 0.3), а не в пикселях; - положи в
ScreenGuiобъектUIScaleи меняй его в зависимости от размера экрана; - вместо ручной расстановки бери
UIListLayoutиUIGridLayout— они пересчитаются сами; IgnoreGuiInsetуScreenGuiоставь выключенным, иначе интерфейс залезет под вырез камеры;- у текста включи
TextScaled, но обязательно поставьUITextSizeConstraint— без него подпись превращается в нечитаемые три пикселя.
Убери то, чего на телефоне быть не должно#
Подсказки вроде «нажми F, чтобы заблокировать» на телефоне бессмысленны и занимают место. У ProximityPrompt для этого есть готовое поведение: он сам показывает клавишу на компьютере и кружок под палец на телефоне, ничего дописывать не нужно.
А вот собственные надписи придётся прятать руками:
local UserInputService = game:GetService("UserInputService")
local hint = script.Parent:WaitForChild("KeyboardHint")
local function refresh()
hint.Visible = UserInputService.KeyboardEnabled
end
refresh()
-- Способ ввода меняется на ходу: человек подключил геймпад
-- или отложил его и взялся за экран. Подписываемся и обновляем.
UserInputService.LastInputTypeChanged:Connect(refresh)Прятать — не то же самое, что удалять
Речь про подсказки о клавишах, а не про сам блок с содержимым. Если на телефоне пропадает половина возможностей игры — это не адаптация, это урезанная версия, и её замечают сразу.
Чек-лист перед публикацией#
- Открыл игру в эмуляторе на самом маленьком телефоне — ничего не уехало за край.
- Все действия доступны без клавиатуры.
- Кнопки не меньше 44 точек и не липнут друг к другу.
- Ничего важного не закрыто большим пальцем в правом нижнем углу.
- Текст читается без прищуривания.
- Проверил на настоящем телефоне, а не только в Studio.
- В настройках игры на сайте Roblox отмечены телефон и планшет — иначе игра просто не появится в мобильном поиске.
Последний пункт пропускают чаще всего. Игра может быть идеально приспособлена под палец, но если в настройках не отмечены поддерживаемые устройства, мобильные игроки её не увидят — а это как раз то самое большинство.

Обсуждение
Пиши по делу и без личных данных. Ссылки на сторонние сайты, обмен и «бесплатные робуксы» мы скрываем — почему.
Комментарии пишут те, кто вошёл — так спокойнее всем.
ВойтиПока никто ничего не написал. Будь первым.