Я уже немного рассматривал GUI пользовательского интерфейса. В данном случае пойдёт речь о GUI на объектах — т.е. на предметах пространства. Начнём с нюансов:
- Если между GUI и игроком есть хоть миллиметр преграды — оно работать не будет.
- Взаимодействие с GUI предполагается, через LocalScript. Это не значит, что оно не будет работать посредством серверных скриптов, только вот через них не получишь игрока, который с ними взаимодействовал.
- LocalScript может работать, только на стороне пользователя, а значит может быть запущен только в определённых местах из чего может следовать, что привязка скрипта к интерфейсу должна быть внутри скрипта.
- При использовании серверного Script может быть необходима работа через удалённые функции.
![image](https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/9/1/7/9175a603c1507efa2a424759a375214909c7a427.png)
Итак. Создаём обычный part — что будет выступать объектом и кладём на него наш будущий интерфейс:
![](http://blog.rconshop.ru/wp-content/uploads/2020/06/image.png)
Ну а скрипт запихнём в.. туда где он может работать:
![](http://blog.rconshop.ru/wp-content/uploads/2020/06/image-1.png)
И сам скрипт:
-- активация покупки по нажатию кнопки на объекте local Player = game.Players.LocalPlayer -- активировавший игрок local MPS = game:GetService("MarketplaceService") -- привязка к сервису local SurfacePart = workspace:WaitForChild("SurfaceBlock") -- ищем наш объект local SurfaceGui = SurfacePart.SurfaceGui -- поверхность на объекте local Button = SurfaceGui.TextButton -- собственно сама кнопка local ID = 998598719 -- Developer Product Id Button.Activated:Connect(function() -- привязка активации кнопки MPS:PromptProductPurchase(game.Players.LocalPlayer, ID) -- действия при активации кнопки end)
Вот собственно и всё что нам нужно. Теперь при нажатии кнопки будет выскакивать окно о покупке нашего продукта. Или ошибка, если кода такого продукта нет.
![](http://blog.rconshop.ru/wp-content/uploads/2020/06/image-2.png)
Если же мы приверженцы хранить всё по полочкам (а вдруг), тогда интерфейс нужно перенести в StarterGui, а в свойствах GUI поверхности указать объект в параметре Adomee. Ну и скрипт уже держать непосредственно под кнопкой.
![](http://blog.rconshop.ru/wp-content/uploads/2020/06/image-4.png)
В результате чего он несколько похудеет.
-- активация покупки по нажатию кнопки на объекте local Player = game.Players.LocalPlayer -- активировавший игрок local MPS = game:GetService("MarketplaceService") -- привязка к сервису local Button = script.Parent -- собственно сама кнопка local ID = 998598719 -- Developer Product Id Button.Activated:Connect(function() -- привязка активации кнопки MPS:PromptProductPurchase(game.Players.LocalPlayer, ID) -- действия при активации кнопки end)
Оба варианта будут выглядеть так:
![](http://blog.rconshop.ru/wp-content/uploads/2020/06/image-6.png)
Пример использования интерфейса на поверхности можно увидеть тут:
https://www.roblox.com/games/4789977549/Math-Rocket