Roblox · Интерфейсы

Кнопки для телефона

На телефоне появляются круглые кнопки над прыжком: «Бег» и «Привет». На компьютере те же действия — на клавишах R и G. Одна строка — и у действия есть кнопка на экране.

Структура

Синим — что нужно создать.

StarterPlayer → StarterPlayerScripts
└─ MobileButtonsLocal (LocalScript)

Шаги

  1. StarterPlayer → StarterPlayerScripts → LocalScript «MobileButtonsLocal».
  2. ContextActionService:BindAction(имя, функция, true, клавиша): true — создать кнопку на сенсорном экране. На компьютере кнопки нет, работает клавиша.
  3. SetTitle — надпись на кнопке, SetPosition — место (относительно области рядом с прыжком), SetImage — своя картинка.
  4. Функция получает состояние: Begin — нажали, End — отпустили. Вернуть Sink — нажатие обработано, Pass — передать дальше.
  5. Своё действие (рывок, стрельба, способность): ещё один BindAction со своей функцией.
  6. Проверка без телефона: Test → Device → выбери телефон (эмулятор устройства) и запусти Play.

Скрипты

MobileButtonsLocal

Где: StarterPlayer → StarterPlayerScripts · LocalScript
Зачем: Кнопки «Бег» и «Привет».

-- игроки
local Players = game:GetService("Players")
-- действия: клавиша + кнопка на экране телефона
local CAS = game:GetService("ContextActionService")
-- этот игрок
local player = Players.LocalPlayer
-- бег
local RUN_SPEED = 24
-- шаг
local WALK_SPEED = 16
-- стандартное «помахать» R15
local WAVE_ID = "rbxassetid://507770239"
-- бежим?
local running = false

-- Humanoid персонажа
local function GetHumanoid()
    -- персонаж
    local character = player.Character
    -- или nil
    return character and character:FindFirstChildOfClass("Humanoid")
-- конец функции
end

-- кнопка «Бег»: включить / выключить
local function Run(_, state)
    -- только нажатие
    if state ~= Enum.UserInputState.Begin then return Enum.ContextActionResult.Pass end
    -- Humanoid
    local humanoid = GetHumanoid()
    -- нет персонажа
    if not humanoid then return Enum.ContextActionResult.Pass end
    -- переключаем
    running = not running
    -- скорость
    humanoid.WalkSpeed = running and RUN_SPEED or WALK_SPEED
    -- надпись на кнопке
    CAS:SetTitle("Run", running and "Шаг" or "Бег")
    -- нажатие обработано
    return Enum.ContextActionResult.Sink
-- конец функции
end

-- кнопка «Привет»
local function Wave(_, state)
    -- только нажатие
    if state ~= Enum.UserInputState.Begin then return Enum.ContextActionResult.Pass end
    -- Humanoid
    local humanoid = GetHumanoid()
    -- анимации
    local animator = humanoid and humanoid:FindFirstChildOfClass("Animator")
    -- нет персонажа
    if not animator then return Enum.ContextActionResult.Pass end
    -- анимация
    local animation = Instance.new("Animation")
    -- какая
    animation.AnimationId = WAVE_ID
    -- машем
    animator:LoadAnimation(animation):Play()
    -- обработано
    return Enum.ContextActionResult.Sink
-- конец функции
end

-- R на клавиатуре; true — кнопка на телефоне
CAS:BindAction("Run", Run, true, Enum.KeyCode.R)
-- надпись
CAS:SetTitle("Run", "Бег")
-- над кнопкой прыжка
CAS:SetPosition("Run", UDim2.new(0.72, -25, 0.2, -25))
-- G на клавиатуре
CAS:BindAction("Wave", Wave, true, Enum.KeyCode.G)
-- надпись
CAS:SetTitle("Wave", "Привет")
-- левее
CAS:SetPosition("Wave", UDim2.new(0.42, -25, 0.55, -25))
-- новый персонаж
player.CharacterAdded:Connect(function()
    -- снова шагом
    running = false
    -- надпись
    CAS:SetTitle("Run", "Бег")
-- конец функции
end)

Проверка

Запусти Play (или Run) и убедись:

Собрать кнопки для телефона одной командой