Интерфейс из кода: ScreenGui, кнопки и Scale
Создавать и оживлять интерфейс из LocalScript.
Теория
Интерфейс игрока — обычные объекты в дереве: ScreenGui, внутри Frame, внутри кнопки и надписи. Их можно расставить мышкой в StarterGui, а можно создать кодом — движок разницы не видит.
Управляет интерфейсом клиент: это LocalScript. Сервер к чужому экрану не лезет, он лишь присылает данные, а рисует их клиент.
Размеры задаются в UDim2 из двух частей: доля экрана и пиксели. Доля тянется вместе с экраном, пиксели остаются как есть. Отсюда правило: габариты — в долях, отступы — в пикселях.
- UDim2.fromScale(0.4, 0.3) — сорок процентов ширины и тридцать высоты
- AnchorPoint(0.5, 0.5) вместе с позицией 0.5, 0.5 ставит панель ровно по центру
- Activated — правильное событие кнопки: работает и на тапе, и на геймпаде
- TextScaled спасает от надписи, вылезающей за кнопку
Пример
Панель с кнопкой, которая считает нажатия.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal gui = Instance.new("ScreenGui")gui.Name = "Counter"gui.ResetOnSpawn = falsegui.Parent = player:WaitForChild("PlayerGui")local button = Instance.new("TextButton")button.Size = UDim2.fromScale(0.3, 0.1)button.Position = UDim2.fromScale(0.5, 0.85)button.AnchorPoint = Vector2.new(0.5, 0.5)button.TextScaled = truebutton.Text = "Нажми: 0"button.Parent = guilocal corner = Instance.new("UICorner")corner.CornerRadius = UDim.new(0, 12)corner.Parent = buttonlocal clicks = 0button.Activated:Connect(function()clicks += 1button.Text = "Нажми: " .. clicksend)
Задача
Добавь к панели вторую кнопку «Сброс», которая обнуляет счётчик. Расположи кнопки так, чтобы они не наезжали друг на друга на узком экране.
- UIListLayout внутри Frame расставит кнопки сам
- Не задавай кнопкам ширину в пикселях
Показать решение
local frame = Instance.new("Frame")frame.Size = UDim2.fromScale(0.34, 0.2)frame.Position = UDim2.fromScale(0.5, 0.82)frame.AnchorPoint = Vector2.new(0.5, 0.5)frame.BackgroundTransparency = 1frame.Parent = guilocal layout = Instance.new("UIListLayout")layout.Padding = UDim.new(0, 8)layout.HorizontalAlignment = Enum.HorizontalAlignment.Centerlayout.Parent = framebutton.Parent = framebutton.Size = UDim2.fromScale(1, 0.45)local reset = button:Clone()reset.Text = "Сброс"reset.Parent = framereset.Activated:Connect(function()clicks = 0button.Text = "Нажми: 0"end)
Проверь себя
Где должен лежать скрипт, управляющий интерфейсом?
Показать ответ
Интерфейс — дело клиента: сервер чужой экран не рисует.
Почему габариты задают в Scale, а не в Offset?
Показать ответ
Пиксельная панель на маленьком экране занимает его целиком, доля — нет.