Costruire widget del Studio

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Studio ti dà il potere di creare widget personalizzati e usarli come strumenti e estensioni di Studio. Questi widget si comportano come finestre/panelli personalizzati in Studio e puoi dockarli all'interno della tua interfaccia o farli fluttuare come finestre separate.

Creazione di interfaccie utente widget

Tutti i widget di Studio iniziano come DockWidgetPluginGui oggetti che puoi riempire con GuiObjects, come etichette e pulsanti. Per creare un'interfaccia utente vuota, chiama la funzione CreateDockWidgetPluginGui(), passando

Nota che il DockWidgetPluginGuiInfo.new() costruttore si aspetta i suoi parametri in un ordine specifico come segue:

#ProprietàTipoDescrizione
1Enum.InitialDockStateListaUna delle Enum.InitialDockState enumerazioni.
2InitialEnabledBooleanoLo stato inizialmente abilitato (visibile) della GUI or Intefaccia grafica utentedel widget.
3InitialEnabledShouldOverrideRestoreBooleanoSe vero, il valore di InitialEnabled sovrascriva lo stato abilitato precedentemente salvato.
4FloatingXSizeInteroLa larghezza iniziale della GUI quando InitialDockState è impostata su Enum.InitialDockState.Float .
5FloatingYSizeInteroL'altezza iniziale della GUI quando InitialDockState è impostata su Enum.InitialDockState.Float .
6MinWidthInteroLa larghezza minima della GUI or Intefaccia grafica utente, con alcune variazioni specifiche della piattaforma.
7MinHeightInteroL'altezza minima della GUI or Intefaccia grafica utente, con alcune variazioni specifiche della piattaforma.

-- Crea un nuovo oggetto "DockWidgetPluginGuiInfo"
local widgetInfo = DockWidgetPluginGuiInfo.new(
Enum.InitialDockState.Float, -- Il widget sarà inizializzato nel pannello fluttuante
true, -- Il widget sarà inizialmente abilitato
false, -- Non sovrascrivi lo stato abilitato precedente
200, -- Larghezza predefinita della finestra fluttuante
300, -- Altezza predefinita della finestra fluttuante
150, -- Larghezza minima della finestra fluttuante
150 -- Altezza minima della finestra fluttuante
)
-- Crea nuova GUI or Intefaccia grafica utentewidget
local testWidget = plugin:CreateDockWidgetPluginGui("TestWidget", widgetInfo)
testWidget.Title = "Test Widget" -- Optional widget title

Personalizzare l'interfaccia utente del widget

Una volta creato un Widget, puoi personalizzare la sua interfaccia utente con GuiObjects come informative TextLabels o interattive ImageButtons . Ad esempio, il seguente codice aggiunge un 1> Class.TextButton1> di base alla finestra GUI:


-- Crea nuova GUI or Intefaccia grafica utentewidget
local testWidget = plugin:CreateDockWidgetPluginGui("TestWidget", widgetInfo)
testWidget.Title = "Test Widget" -- Titolo del widget opzionale
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

Cambiare temi di colore di Studio

I widget di Studio idealmente corrispondono alla impostazione e regolazione dinamica dello Studio tema . Ad esempio, se uno sviluppatore sta usando il tema oscuro, il colore di sfondo del Widget, le immagini e le etichetta di testo dovrebbero apparire bene accanto alle colori di tema native di Studio.

Il seguente codice di aggiungimento utilizza una funzione syncGuiColors() che inizialmente viene chiamata insieme a una tabella di oggetti GUI per sincronizzare. All'interno


testButton.Parent = testWidget
local function syncGuiColors(objects)
local function setColors()
for _, guiObject in objects do
-- Sincronizza colore di sfondo
guiObject.BackgroundColor3 = settings().Studio.Theme:GetColor(Enum.StudioStyleGuideColor.MainBackground)
-- Sincronizza il colore del testo
guiObject.TextColor3 = settings().Studio.Theme:GetColor(Enum.StudioStyleGuideColor.MainText)
end
end
-- Esegui il funzione 'setColors()' per sincronizzare inizialmente i colori
setColors()
-- Connetti l'evento 'ThemeChanged' alla funzione 'setColors()'
settings().Studio.ThemeChanged:Connect(setColors)
end
-- Esegui la funzione 'syncGuiColors()' per sincronizzare i colori degli oggetti forniti
syncGuiColors({testButton})

Personalizzare i cursori del mouse

Per migliorare la prevista interazione con gli elementi del widget, puoi impostare mouse cursors specifici del sistema sui GUI eventi, come MouseEnter e Class.GuiObject.MouseLeave|Mouse


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

Fai riferimento alla seguente tabella per un elenco di cursori del mouse e dei loro potenziali casi d'uso:

Icona del cursore del mouseAttivitàUsa Custome
rbxasset://SystemCursors/ArrowClicca e seleziona predefinito.
rbxasset://SystemCursors/PointingHandPassare il mouse su un link/ pulsante attivo.
rbxasset://SystemCursors/OpenHandPassare il mouse su un Articolotrascinabile.
rbxasset://SystemCursors/ClosedHandTrascinare un Articolo.
rbxasset://SystemCursors/IBeamPassare in un campo di testo.
rbxasset://SystemCursors/SizeNSPassare il mouse su una gestiredi ridimensionamento verticale.
rbxasset://SystemCursors/SizeEWPassare il mouse su una gestiredi ridimensionamento orizzontale.
rbxasset://SystemCursors/SizeNESWPassare il mouse su un'immagine di gestire.
rbxasset://SystemCursors/SizeNWSEPassare il mouse su un'immagine di gestire.
rbxasset://SystemCursors/SizeAllPassare il mouse su una gestiredi ridimensionamento multi-direzione.
rbxasset://SystemCursors/SplitNSPassare il mouse su un gestire"spaccabile" verticale.
rbxasset://SystemCursors/SplitEWPassare il mouse su un'gestireorizzontale "spaccata".
rbxasset://SystemCursors/ForbiddenPassare il mouse su un Articolobloccato/vietato.
rbxasset://SystemCursors/WaitIndica un'azione in corso.
rbxasset://SystemCursors/BusyIndicare che il sistema è occupato.
rbxasset://SystemCursors/CrossPassare con il mouse su un'area di selezione.

Raccogliere input dell'utente

Gli elementi UI come TextBox e TextButton funzionano normalmente nei widget di Studio, e puoi costruire interfacce come normalmente faresti su Roblox. Tuttavia, UserInputService e 1> Class.ContextActionService1> non funzionano poiché questi servizi aspettano che la finestra di gioco principale sia in focus.

Un workaround per gli eventi di input generici è creare un Frame trasparente e superarlo sull'intero schermo. Il seguente esempio di codice crea un frame, e quando l'utente fa clic sul frame, l'evento GuiObject.InputBegan cattura l'input del tastierino sullo schermo fino a quando l'utente non fa clic via:


local frame = Instance.new("Frame")
frame.BackgroundTransparency = 1 -- Nascondi il frame
frame.Size = UDim2.new(1, 0, 1, 0) -- Coprire lo schermo
frame.Position = UDim2.new(0, 0, 0, 0)
frame.Parent = testWidget
local function onInputBegan(inputObject)
-- Elabora l'oggetto di input qui, ad esempio per rilevare i pulsanti della chiave
end
frame.InputBegan:Connect(onInputBegan)

Interazione trascinamento-e-rilascio

Usare interazioni a trascinamento per i tuoi widget è un modo semplice per migliorare il flusso di dati. Per creare questa interazione, devi definire l'elemento da trascinare, inizializzare il trascinamento e creare un obiettivo di trascinamento.

Creazione di una fonte di trascinamento

Puoi iniziare un'azione di trascinamento chiamando Plugin:StartDrag() quando l'utente premere un pulsante del mouse su un elemento UI, in genere un TextButton o un ImageButton all'interno di un Widget. Il seguente esempio di codice crea un singolo widget di finestra con un pulsante di testo all'interno.


-- Crea prima il widget
local widgetInfo = DockWidgetPluginGuiInfo.new(Enum.InitialDockState.Float, true, true, 300, 200)
local dragSourceWidget = plugin:CreateDockWidgetPluginGui("Drag Source", widgetInfo)
dragSourceWidget.Title = "Drag Source"
-- Crea un TextButton che inizierà il trascinamento
local dragButton = Instance.new("TextButton")
dragButton.Size = UDim2.new(1, 0, 1, 0)
dragButton.Text = "Drag me!"
dragButton.Parent = dragSourceWidget

Inizializzazione della trascinata

Quando l'utente fa clic sul TextButton , puoi iniziare a trascinare attraverso l'evento MouseButton1Down() che si attiva non appena l'utente premere il pulsante del mouse.

All'interno della funzione connessa, determinare i dati da拖. Il tipo di dati 0> tipo di dati0> dovrebbe essere riflesso nella chiave 3>MimeType3>, il contenuto 6>contain 6> della drag dovrebbe essere riflesso nella chiave 9>Data


local function onButton1Down()
local dragInfo = {
Data = "Hello, world", -- I dati che vengono trascinati
MimeType = "text/plain", -- Descrive il tipo MIME dei dati
Sender = "SomeDragSource", -- Descrive da dove vengono originati i dati
MouseIcon = "", -- Contenuto dell'immagine da utilizzare per il cursore
DragIcon = "", -- Contenuto dell'immagine da rendere sotto il cursore durante il trascinamento
HotSpot = Vector2.zero -- Dove sull'Icona di trascinamento per centrare il cursor
}
plugin:StartDrag(dragInfo)
end
dragButton.MouseButton1Down:Connect(onButton1Down)

Creazione di un target a goccia

L'evento PluginGui.PluginDragDropped attiva quando l'utente rilascia il mouse su una finestra durante un trascinamento. Quando ciò accade, devi definire un drop target come un secondo widget con un TextLabel per rilevare i trascini.


local dragTargetWidget = plugin:CreateDockWidgetPluginGui("Drop Target", widgetInfo)
dragTargetWidget.Title = "Drop Target"
-- Questa TextLabel mostrerà ciò che è stato lasciato
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(1, 0, 1, 0)
textLabel.Text = "Drop here..."
textLabel.Parent = dragTargetWidget

Elaborando l'azione di caduta

Dopo aver creato un target di caduta, connect the PluginGui.PluginDragDropped event on the drop target Widget:


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)

Mentre un trascinamento è ancora in corso, questi tre eventi vengono attivati mentre l'utente muove il mouse su un Widget:

  • PluginDragEntered – si attiva quando l'utente passa il mouse su una finestra
  • PluginDragMoved – si attiva ripetutamente mentre l'utente passa il mouse su una finestra. Questo è utile per mostrare un Messaggio"Drop here!" .
  • PluginDragLeft – si attiva quando il cursore dell'utente lascia una finestra. Questo è utile per nascondere un Messaggio"Drop here!" .