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

Инвентарь-хотбар с клавишами 1–9

Свой хотбар вместо стандартного рюкзака: 9 ячеек внизу экрана с картинками предметов и номерами. 1–9 или клик — взять, ещё раз — убрать. Предмет в руке подсвечен.

Структура

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

StarterGui
└─ HotbarGui (ScreenGui) — ResetOnSpawn выкл.
   ├─ Bar (Frame) — UIListLayout горизонтальный
   │  └─ Sample (TextButton) — шаблон, Visible выкл.
   │     ├─ Icon (ImageLabel)
   │     ├─ ToolName (TextLabel) — имя, если нет картинки
   │     └─ Key (TextLabel) — номер
   └─ HotbarLocal (LocalScript)
StarterPack
└─ Меч, Факел, Яблоко (Tool) — для проверки

Шаги

  1. StarterGui → ScreenGui «HotbarGui» → Frame «Bar» внизу по центру (Size {0.5,0},{0.08,0}), без фона.
  2. В Bar — UIListLayout: FillDirection Horizontal, HorizontalAlignment Center, Padding 6.
  3. Шаблон TextButton «Sample» (Size {1,0},{1,0}, Text пустой, Visible выкл.) с UIAspectRatioConstraint: внутри ImageLabel «Icon», TextLabel «ToolName», маленький TextLabel «Key» в углу.
  4. LocalScript «HotbarLocal»: прячет стандартный рюкзак Roblox и строит 9 ячеек.
  5. Картинка предмета — свойство TextureId у Tool. Нет картинки — в ячейке пишется имя.
  6. Ячейки обновляются сами: подобрал, купил, выбросил (Backspace), погиб — порядок предметов сохраняется.

Скрипты

HotbarLocal

Где: StarterGui → HotbarGui · LocalScript
Зачем: Хотбар на 9 ячеек.

-- игроки
local Players = game:GetService("Players")
-- стандартный интерфейс
local StarterGui = game:GetService("StarterGui")
-- клавиатура
local UIS = game:GetService("UserInputService")
-- этот игрок
local player = Players.LocalPlayer
-- полоса ячеек
local bar = script.Parent:WaitForChild("Bar")
-- шаблон ячейки
local sample = bar:WaitForChild("Sample")
-- ячеек
local SLOTS = 9
-- клавиши 1–9
local KEYS = {Enum.KeyCode.One, Enum.KeyCode.Two, Enum.KeyCode.Three, Enum.KeyCode.Four, Enum.KeyCode.Five, Enum.KeyCode.Six, Enum.KeyCode.Seven, Enum.KeyCode.Eight, Enum.KeyCode.Nine}
-- обычная ячейка
local NORMAL = Color3.fromRGB(40, 40, 50)
-- предмет в руке
local EQUIPPED = Color3.fromRGB(80, 160, 255)
-- инструменты в порядке получения
local order = {}
-- ячейки
local slots = {}

-- прячем стандартный рюкзак Roblox
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, false)

-- создаём ячейки
for i = 1, SLOTS do
    -- копия шаблона
    local slot = sample:Clone()
    -- имя
    slot.Name = "Slot" .. i
    -- по порядку
    slot.LayoutOrder = i
    -- номер клавиши
    slot.Key.Text = tostring(i)
    -- шаблон был скрыт
    slot.Visible = true
    -- в полосу
    slot.Parent = bar
    -- запоминаем
    slots[i] = slot
-- конец цикла
end

-- обновить список инструментов
local function Collect()
    -- что есть сейчас
    local current = {}
    -- рюкзак и руки
    for _, holder in ipairs({player:FindFirstChildOfClass("Backpack"), player.Character}) do
        -- есть
        if holder then
            -- всё внутри
            for _, tool in ipairs(holder:GetChildren()) do
                -- инструменты
                if tool:IsA("Tool") then current[tool] = true end
            -- конец перебора
            end
        -- конец проверки
        end
    -- конец перебора
    end
    -- с конца списка
    for i = #order, 1, -1 do
        -- пропавшие убираем
        if not current[order[i]] then table.remove(order, i) end
    -- конец цикла
    end
    -- все текущие
    for tool in pairs(current) do
        -- новые — в конец
        if not table.find(order, tool) then table.insert(order, tool) end
    -- конец перебора
    end
-- конец функции
end

-- перерисовать ячейки
local function Refresh()
    -- актуальный список
    Collect()
    -- персонаж
    local character = player.Character
    -- каждая ячейка
    for i, slot in ipairs(slots) do
        -- её инструмент
        local tool = order[i]
        -- картинка (TextureId у Tool)
        slot.Icon.Image = tool and tool.TextureId or ""
        -- нет картинки — пишем имя
        slot.ToolName.Text = (tool and tool.TextureId == "") and tool.Name or ""
        -- в руке — подсветка
        slot.BackgroundColor3 = (tool and tool.Parent == character) and EQUIPPED or NORMAL
        -- пустая — бледнее
        slot.BackgroundTransparency = tool and 0.1 or 0.5
    -- конец перебора
    end
-- конец функции
end

-- взять или убрать предмет из ячейки i
local function Toggle(i)
    -- инструмент
    local tool = order[i]
    -- персонаж
    local character = player.Character
    -- Humanoid
    local humanoid = character and character:FindFirstChildOfClass("Humanoid")
    -- пусто или погиб
    if not tool or not humanoid or humanoid.Health <= 0 then return end
    -- уже в руке
    if tool.Parent == character then
        -- убираем
        humanoid:UnequipTools()
    -- в рюкзаке
    else
        -- берём
        humanoid:EquipTool(tool)
    -- конец проверки
    end
-- конец функции
end

-- каждая ячейка
for i, slot in ipairs(slots) do
    -- клик или касание
    slot.Activated:Connect(function() Toggle(i) end)
-- конец перебора
end
-- нажали клавишу
UIS.InputBegan:Connect(function(input, processed)
    -- печатаем в чате
    if processed then return end
    -- это 1–9?
    local i = table.find(KEYS, input.KeyCode)
    -- ячейка с этим номером
    if i then Toggle(i) end
-- конец функции
end)

-- следим за рюкзаком или персонажем
local function Watch(holder)
    -- появился предмет
    holder.ChildAdded:Connect(Refresh)
    -- пропал предмет
    holder.ChildRemoved:Connect(Refresh)
    -- сразу
    Refresh()
-- конец функции
end
-- новый рюкзак (после возрождения)
player.ChildAdded:Connect(function(child)
    -- следим
    if child:IsA("Backpack") then Watch(child) end
-- конец функции
end)
-- новый персонаж
player.CharacterAdded:Connect(Watch)
-- рюкзак уже есть
if player:FindFirstChildOfClass("Backpack") then Watch(player:FindFirstChildOfClass("Backpack")) end
-- персонаж уже есть
if player.Character then Watch(player.Character) end

Проверка

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

Собрать хотбар одной командой