Как же RPG составляющая без крафта? Никак!
Вариантов существует великое множество. У нас же будет самый простой вариант, без каких либо ограничений. Ну разве что одно — должны быть ресурсы в наличии.
Как обычно, на создании окна GUI заострять внимания не буду. Оно будет таким:

Но раз уж у нас второе окно, то придётся делать и кнопки HUD для открытия/закрытия окон. Тоже выпендриваться не буду и сделаю их простыми, тектовыми:

Получив, в итоге, такое строение в StarterGui. Это даёт нам возможность управлять окнами включением/выключением соответствующего Screen.

Вот собственно код HUD:
local HUD = script.Parent -- убрать всё с экрана кроме HUD for a, b in pairs(HUD.Parent:GetChildren()) do if b ~= HUD then b.Enabled = false end end -- все кнопки тут должны открывать и закрывать другие экраны for a, b in pairs(HUD:GetChildren()) do if b:IsA("GuiButton") then local button = HUD.Parent:FindFirstChild(b.Name) if button then b.Activated:Connect(function() button.Enabled = not button.Enabled end) end end end
Как видим, тут всё просто. Сперва выключаем все Screen кроме HUD, а после просто инвертируем значение Enabled по нажатой кнопке. Соответственно имена кнопок и экранов одинаковые.
Следующим шагом создадим табличку для крафта — что и из чего будет создавать. Для примера набросал такую:
return { Plank = { -- доски Result = 1, -- сколько на выходе Timer = 5, -- время изготовления Resource = { -- затраты ресурсов Wood = 1, }, Desc = "Не обструганные доски" }, Heap = { -- шапка Result = 1, Timer = 15, Resource = { Thatch = 10, Leaves = 5 }, Desc = "Соломенная шляпа" }, ["Ingot metall"] = { Result = 1, Timer = 10, Resource = { Metall = 10, Stone = 10, Flint = 1, }, Desc = "Слиток металла" }, Nails = { Result = 10, Timer = 5, Resource = { ["Ingot metall"] = 1, Wood = 10, }, Desc = "Обычные гвозди" }, Table = { Result = 1, Timer = 15, Resource = { Nails = 1, Plank = 15, }, Desc = "Простой стол" } }
Обращаем внимание, что созданный элемент так же может стать частью нового рецепта крафта. На примере «Ingot metall».
Теперь нам нужен скрипт что будет заполнять левую часть окна по этой таблице и правую по нажатой кнопке слева. Ну и конечно, при наличии ресурсов, создавать предмет.
local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local craftTable = require( ReplicatedStorage:WaitForChild("Resource"):WaitForChild("Craft") ) local player = Players.LocalPlayer local invent = player:WaitForChild("Inventory") local main = script.Parent local info = main:WaitForChild("Info") local recept = main:WaitForChild("Recipient") local sample = recept:WaitForChild("Sample"):Clone() local ui = recept:WaitForChild("UIListLayout"):Clone() local selected = info:WaitForChild("Select") -- изменение выбранного рецепта local function SelectChange(value) -- отобразить информацию local val = selected.Value -- что именно выбрали для крафта local element = craftTable[val] print(element) -- вывод информации о рецепте крафта if element then info.Title.Text = val local res = "" for a, b in pairs(element.Resource) do if res ~= "" then -- добавим перевод строки res = res .. "\n" end res = res .. a .. " x " .. tostring(b) end info.Compound.Text = res info.Description.Text = element.Desc end local flag = true -- можно крафтить for a, b in pairs(element.Resource) do local res = invent:FindFirstChild(a) if res then if b > res.Value then flag = false -- не хватает ресурса end else -- нет ресурса flag = false end end if flag then info.btnCraft.Interactable = true info.btnCraft.TextColor3 = Color3.new(0, 1, 0) else info.btnCraft.Interactable = false info.btnCraft.TextColor3 = Color3.new(1, 0, 0) end end selected.Changed:Connect(SelectChange) -- создание предмета function Craft() local val = selected.Value -- что именно выбрали для крафта local element = craftTable[val] -- заберём ресурсы for a, b in pairs(element.Resource) do local res = invent:FindFirstChild(a) res.Value = res.Value - b -- если кончилось нужно удалить из инвентаря if res.Value == 0 then res:Destroy() end end -- добавим что скрафтили local new = invent:FindFirstChild(val) if new == nil then -- ещё нет в инвентаре new = Instance.new("NumberValue") new.Name = val end new.Value = new.Value + element.Result new.Parent = invent -- проверка можно ли ещё раз крафтить local flag = true -- можно крафтить for a, b in pairs(element.Resource) do local res = invent:FindFirstChild(a) if res then if b > res.Value then flag = false -- не хватает ресурса end else -- нет ресурса flag = false end end if flag then info.btnCraft.Interactable = true info.btnCraft.TextColor3 = Color3.new(0, 1, 0) else info.btnCraft.Interactable = false info.btnCraft.TextColor3 = Color3.new(1, 0, 0) end end info.btnCraft.Activated:Connect(Craft) recept:ClearAllChildren() local uis = ui:Clone() uis.Parent = recept for nam, var in pairs(craftTable) do -- создание элемента списка local new = sample:Clone() new.Name = nam new.Names.Text = var.Desc new.Parent = recept new.Button.Activated:Connect(function() selected.Value = nam end) end
Что будет выглядеть примерно так:

И соответственно после крафта получаем новые предметы в инвентаре:

Что собственно нам и нужно было.
Как обычно (уже) плейс разработки прилагается.