Budowanie widżetów Studio

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Studio daje Ci możliwość tworzenia niestandardowych widgetów i używania ich jako narzędzi i rozszerzeń Studio. Te widgety zachowują się jako niestandardowe okna/Paneli w Studio, a możesz je zacumować w swoim interfejsie lub umieścić je jako oddzielne okna.

Tworzenie interfejsów użytkownika

Wszystkie widgety Studio zaczynają się jako DockWidgetPluginGui obiekty, które można wypełnić GuiObjects , takie jak etykiety tekstowe i przyciski. Aby stworzyć pusty widget GUI, wezwij funkcję Class.Plugin:CreateDockWidgetPluginGui()|CreateDock

Uwaga na DockWidgetPluginGuiInfo.new() konstruktor oczekuje swoich parametrów w szczególnym porządku tak jak następuje:

#WłasnośćTypOpis
1Enum.InitialDockStateEnumJedna z listy Enum.InitialDockState list.
2InitialEnabledBooleanPoczątkowy, włączony ( widoczny ) stan interfejsu GUI.
3InitialEnabledShouldOverrideRestoreBooleanJeśli prawda, wartość Włączone初 przekracza poprzednio zapisany stan włączonego.
4FloatingXSizeCałkowityPoczątkowa szerokość GUI, gdy Początkowy stan dokaku jest ustawiony na Enum.InitialDockState.Float .
5FloatingYSizeCałkowityPoczątkowa wysokość GUI, gdy InicialDockState jest ustawiony na Enum.InitialDockState.Float.
6MinWidthCałkowityMinimalna szerokość GUI, z kilku różnicami platformowymi.
7MinHeightCałkowityMinimum wysokości GUI, z kilku różnicami platformowymi.

-- Utwórz nowy obiekt "DockWidgetPluginGuiInfo"
local widgetInfo = DockWidgetPluginGuiInfo.new(
Enum.InitialDockState.Float, -- Widget zostanie zainicjowany w płynnym panelu
true, -- widget zostanie najpierw włączony
false, -- Nie przejmuj poprzedniego włączonego stanu
200, -- Domyślna szerokość okna pływającego
300, -- Domyślna wysokość okna pływającego
150, -- Minimalna szerokość okna pływającego
150 -- Minimalna wysokość okna pływającego
)
-- Utwórz nowy GUI widget
local testWidget = plugin:CreateDockWidgetPluginGui("TestWidget", widgetInfo)
testWidget.Title = "Test Widget" -- Optional widget title

Personalizowanie interfejsu widżetu

Po utworzeniu widgetu możesz dostosować jego interfejs użytkownika za pomocą GuiObjects , takich jak informacyjne TextLabels lub interaktywne ImageButtons. Na przykład, następujący kod dodaje podstawowy 2>Class.TextButton2> do okienka GUI:


-- Utwórz nowy GUI widget
local testWidget = plugin:CreateDockWidgetPluginGui("TestWidget", widgetInfo)
testWidget.Title = "Test Widget" -- Opcjonalny tytuł wtyczki
local testButton = Instance.new("TextButton")
testButton.BorderSizePixel = 0
testButton.TextSize = 20
testButton.TextColor3 = Color3.new(1,0.2,0.4)
testButton.AnchorPoint = Vector2.new(0.5,0.5)
testButton.Size = UDim2.new(1,0,1,0)
testButton.Position = UDim2.new(0.5,0,0.5,0)
testButton.SizeConstraint = Enum.SizeConstraint.RelativeYY
testButton.Text = "Click Me"
testButton.Parent = testWidget

Zmiany tematów koloru Studio

Skuteczne widgety Studio idealnie pasują do ustawień Studio tytuł i dostosowują się dynamicznie, gdy temat zmienia się. Na instancja, jeśli rozwój używa ciemnego motywu, kolor tła, obrazy i tekstowe etykiety powinny wyglądać dobrze wraz z kolorami motywu natywnego Studio.

Kolejny kod dodawania używa funkcji syncGuiColors(), która jest pierwotnie nazywana wraz z tabelą obiektów GUI do synchronizacji. Wewnątrz


testButton.Parent = testWidget
local function syncGuiColors(objects)
local function setColors()
for _, guiObject in objects do
-- Zsynchronizuj kolor tła
guiObject.BackgroundColor3 = settings().Studio.Theme:GetColor(Enum.StudioStyleGuideColor.MainBackground)
-- Zsynchronizuj kolor tekstu
guiObject.TextColor3 = settings().Studio.Theme:GetColor(Enum.StudioStyleGuideColor.MainText)
end
end
-- Wykonaj funkcję „setColors()”, aby najpierw zsynchronizować kolory
setColors()
-- Połącz wydarzenie "ThemeChanged" z funkcją "setColors()"
settings().Studio.ThemeChanged:Connect(setColors)
end
-- Zajrzyj funkcję 'SyncGUIGuColors ()', aby zsynchronizować kolory dostarczonych obiektów
syncGuiColors({testButton})

Personalizowanie kursorów myszy

Aby poprawić oczekiwane interakcje z elementami widgetu, możesz ustawić systemowe kursory myszy na wydarzenia GUI, takie jak MouseEnter i Class.GuiObject


local function setCursor(cursorAsset)
plugin:GetMouse().Icon = cursorAsset
end
testButton.MouseEnter:Connect(function()
setCursor("rbxasset://SystemCursors/PointingHand")
end)
testButton.MouseLeave:Connect(function()
setCursor("")
end)

Zobacz poniższyą tabelę dla listy kursorów myszy i ich potencjalnych przypadków użycia:

Ikona kursora myszyZasóbUżyj przypadku
rbxasset://SystemCursors/ArrowDomyślne kliknięcie i wyboru.
rbxasset://SystemCursors/PointingHandPrzytrzymywanie nad aktywnym linkiem/przyciskiem.
rbxasset://SystemCursors/OpenHandKolejka nad przedmiotem przeciąganym.
rbxasset://SystemCursors/ClosedHandPrzeciągnięcie przedmiot.
rbxasset://SystemCursors/IBeamPrzytrzymywanie w polu tekstowym.
rbxasset://SystemCursors/SizeNSPrzytrzymywanie nad poziomem skalowania ręcznego.
rbxasset://SystemCursors/SizeEWPrzytrzymywanie nad poziomem skalowania poziomego.
rbxasset://SystemCursors/SizeNESWPrzytrzymaj nad kątem zmień rozmiar uchwytu.
rbxasset://SystemCursors/SizeNWSEPrzytrzymaj nad kątem zmień rozmiar uchwytu.
rbxasset://SystemCursors/SizeAllPrzytrzymaj nad wielokierunkowym uchwytem rozmiarów.
rbxasset://SystemCursors/SplitNSPrzytrzymywanie nad poziomem podziału wertykalnego.
rbxasset://SystemCursors/SplitEWPrzytrzymywanie nad poziomym uchwytem "podziel".
rbxasset://SystemCursors/ForbiddenKolejka nad zamkniętym/zakazanym przedmiotem.
rbxasset://SystemCursors/WaitWskazanie, że jest trwająca akcja.
rbxasset://SystemCursors/BusyWskazanie, że system jest zajęty.
rbxasset://SystemCursors/CrossPrzyciągnięcie uwagi na obszarze wyboru punktu.

Zbieranie danych użytkownika

Elementy interfejsu, takie jak TextBox i TextButton działają normalnie w wbudowanych witrynach Studio, a możesz budować interfejsy tak, jak to zrobiłbyś normalnie na Roblox. Jnak UserInputService i 1>Class.ContextActionService1> nie działają, ponieważ te usługi oczekują, że głównym

Jednym workround dla genéricznych wydarzeń wejścia jest stworzenie przejrzystego Frame i nałożenie go na cały ekran. Poniższy przykład kodu tworzy ramę, a gdy użytkownik kliknie na ramę, wydarzenie GuiObject.InputBegan captures klawiaturowe wejście na ramę, aż użytkownik kliknie:


local frame = Instance.new("Frame")
frame.BackgroundTransparency = 1 -- Ukryj ramę
frame.Size = UDim2.new(1, 0, 1, 0) -- Pokryj ekran
frame.Position = UDim2.new(0, 0, 0, 0)
frame.Parent = testWidget
local function onInputBegan(inputObject)
-- Przetwarzaj obiekt wejścia tutaj, na przykład wykryj klawiatury
end
frame.InputBegan:Connect(onInputBegan)

Interakcja przeciągnij-i-przytrzymaj

Używanie interakcji przeciągnij i upuść dla swoich widżetów jest prostym sposobem na poprawę przepływu danych. Aby stworzyć tę interakcję, musisz zdefiniować element do przeciągnięcia, zainicjować przeciągnięcie i utworzyć cel do przeciągnięcia i wykonaj działanie upuszczenia.

Tworzenie źródła przeciągania

Możesz uruchomić akcję przeciągania, nazyając Plugin:StartDrag() , gdy użytkownik naciśnie przycisk myszy na pewnym elementze interfejsu użytkownika, zwykle TextButton lub ImageButton w ramach wtyczki. Poniższy przykład kodu stworza pojedyncze okno wtyczki z przyciskiem tekstowym w środku.


-- Najpierw stwórz widżet
local widgetInfo = DockWidgetPluginGuiInfo.new(Enum.InitialDockState.Float, true, true, 300, 200)
local dragSourceWidget = plugin:CreateDockWidgetPluginGui("Drag Source", widgetInfo)
dragSourceWidget.Title = "Drag Source"
-- Utwórz przycisk tekstowy, który uruchomi przeciąganie
local dragButton = Instance.new("TextButton")
dragButton.Size = UDim2.new(1, 0, 1, 0)
dragButton.Text = "Drag me!"
dragButton.Parent = dragSourceWidget

Początek przeciągania

Gdy użytkownik klika na TextButton, możesz uruchomić przeciąganie poprzez wydarzenie MouseButton1Down(), które uruchomuje się, gdy użytkownik nacisnął przycisk myszy.

W ramach połączonej funkcji określ dane do przeciągnięcia. Typ danych powinien być odzwierciedlony w kluczu MimeType, zawartość treści przeciągnięcia powinna być odzwierciedlona w kluczu


local function onButton1Down()
local dragInfo = {
Data = "Hello, world", -- Przeciąganie danych
MimeType = "text/plain", -- Opisuje typ MIME danych
Sender = "SomeDragSource", -- Opisuje, skąd pochodzą dane
MouseIcon = "", -- Treść obrazu do użycia dla kursoра
DragIcon = "", -- Treść obrazu do renderowania podczas przeciągania
HotSpot = Vector2.zero -- Gdzie na DragIcon, aby skupić kursektor
}
plugin:StartDrag(dragInfo)
end
dragButton.MouseButton1Down:Connect(onButton1Down)

Tworzenie celu spadkowego

Wydarzenie PluginGui.PluginDragDropped działa, gdy użytkownik uwalnia swoją myszkę na oknie podczas przeciągania. Gdy to się zdarza, musisz zdefiniować cel upuszczenia takiego jak druga wtyczka z TextLabel , aby wykryć upuszczenie.


local dragTargetWidget = plugin:CreateDockWidgetPluginGui("Drop Target", widgetInfo)
dragTargetWidget.Title = "Drop Target"
-- Ten znak ostrzeżenia wyświetli co zostało upuszczone
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(1, 0, 1, 0)
textLabel.Text = "Drop here..."
textLabel.Parent = dragTargetWidget

Przetwarzanie akcji upuszczenia

Po utworzeniu celu spadkowego połącz wydarzenie PluginGui.PluginDragDropped na wiertarku celu spadkowego:


local function onDragDrop(dragData)
print("PluginDragDropped")
if dragData.MimeType == "text/plain" then
textLabel.Text = dragData.Data
else
textLabel.Text = dragData.MimeType
end
end
dragTargetWidget.PluginDragDropped:Connect(onDragDrop)

Podczas gdy wciąż trwa przeciąganie, te trzy wydarzenia pojawiają się, gdy użytkownik przesuwa myszkę nad widżetem:

  • PluginDragEntered – działa, gdy użytkownik przytrzymuje myszkę nad oknem
  • PluginDragMoved – działa powtarzająco się, gdy użytkownik przesuwa myszkę nad okno. To użyteczne do pokazania wiadomość„Drop here!” .
  • PluginDragLeft – działa, gdy kursór użytkownika opuszcza okno. To użyteczne do ukrycia wiadomość„Zrzut tutaj!”.