Inizia
Tutorial intermedi

Crea un'interfaccia utente interattiva

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

Un HUD (Heads-Up Display) nel tuo gioco mostra comunemente elementi dell'interfaccia utente non interattivi come il misuratore di salute dimostrato in Crea misuratori HUD. Inoltre, quasi ogni gioco richiede un'interfaccia utente interattiva come pulsanti che rispondono all'attivazione del giocatore, animano quando attivati, tween in/out menu con altri controlli interattivi, ecc.

Vista di gioco che mostra un pulsante delle impostazioni e un menu delle impostazioni con cursori del volume.

Utilizzando Fondamenti UI - Misuratore HUD come punto di partenza e Fondamenti UI - Interattività come riferimento finale, questo tutorial dimostra:

  • Come posizionare un pulsante delle impostazioni lungo il bordo superiore dello schermo.
  • Progettazione di un menu delle impostazioni contenente cursori interattivi trascinabili.
  • Utilizzo di un ModuleScripts per formare moduli "controller" per il controllo estensibile degli oggetti UI con dichiarazioni di stato.
  • Come collegare i pulsanti all'attivazione del giocatore per attivare/disattivare il menu delle impostazioni.
  • Come collegare i cursori UI trascinabili per regolare separatamente il volume degli effetti sonori e dell'ambiente di sottofondo.

Abilita l'emulatore di dispositivo

Come notato in Crea misuratori HUD, telefoni e tablet hanno la minor quantità di spazio sullo schermo, quindi è importante che i tuoi elementi UI si adattino a schermi più piccoli e che siano chiaramente visibili ai giocatori. Se non lo hai già fatto, abilita l'Emulatore di dispositivo in Studio:

  1. Apri il modello Fondamenti UI - Misuratore HUD in Studio.

  2. Dal menu Test di Studio, attiva Emulatore di dispositivo.

  3. Dalla barra direttamente sopra la vista principale, seleziona un'emulazione telefonica come iPhone X o Samsung Galaxy A51. Quindi, imposta la dimensione della vista su Adatta alla finestra per utilizzare il massimo spazio in Studio.

    Opzioni delle impostazioni dell'emulatore di dispositivo indicate nella parte superiore della finestra di visualizzazione.

Crea il pulsante delle impostazioni

GuiButtons sono elementi dell'interfaccia utente interattivi con funzionalità integrate come l'evento multi-piattaforma Activated che si attiva quando il pulsante viene cliccato o toccato. La classe GuiButton si estende a due variazioni, TextButton e ImageButton, e questo tutorial utilizza un ImageButton a forma di "ingranaggio" per attivare o disattivare il menu delle impostazioni.

Componente Roblox utilizzato per il pulsante delle impostazioni.

Per costruire il pulsante delle impostazioni:

  1. Nella finestra Explorer, individua HUDContainer all'interno di StarterGui.

    Finestra Explorer che mostra il HUDContainer selezionato.
  2. Inserisci un ImageButton in HUDContainer e rinominalo in SettingsButton.

    Finestra Explorer che mostra un nuovo ImageButton inserito e rinominato in SettingsButton. Nuovo ImageButton nella vista.
  3. Con il nuovo pulsante selezionato, imposta i seguenti valori nella finestra Proprietà:

    • AnchorPoint = 0.5, 0.25 (centro orizzontale e quarto superiore verticale)
    • BackgroundTransparency = 1 (completamente trasparente)
    • Position = 0.5, 0, 0, 0 (posizionamento al centro in alto)
    • Size = 0.1, 0, 0.1, 0 (10% dell'altezza dello schermo una volta vincolato il rapporto d'aspetto)
    • Image = rbxassetid://104919049969988 (ID asset del simbolo "ingranaggio")
  4. Inserisci un UIAspectRatioConstraint nel pulsante con proprietà predefinite (rapporto 1:1 tra larghezza e altezza).

    Finestra Explorer che mostra un nuovo UIAspectRatioConstraint inserito nel pulsante SettingsButton.
  5. Per limitare l'altezza massima in pixel del pulsante, inserisci un UISizeConstraint e imposta il suo MaxSize su inf, 44.

    Finestra Explorer che mostra un nuovo UISizeConstraint inserito nel pulsante SettingsButton.
    Finestra Proprietà che mostra i valori attesi per il nuovo UISizeConstraint.
    Pulsante delle impostazioni finale al centro in alto dello schermo.

Crea il menu delle impostazioni

Il nuovo pulsante delle impostazioni sarà programmato per attivare e disattivare un menu delle impostazioni, dando ai giocatori accesso on-demand a impostazioni o altre informazioni. In questo tutorial, il menu conterrà cursori interattivi per regolare i livelli di volume dell'audio di sottofondo e degli effetti sonori in modo indipendente.

Componenti di base utilizzati per il menu delle impostazioni.

Crea il frame genitore

Come notato in Crea misuratori HUD, un Frame funge da contenitore per altri oggetti UI. L'intero menu delle impostazioni sarà costruito con un singolo frame genitore, rendendolo semplice da gestire come oggetto con stato che reagisce all'input in modo diverso a seconda dello stato attuale.

  1. Inserisci un Frame in HUDContainer e rinominalo in SettingsMenu.

    Finestra Explorer che mostra un nuovo frame inserito e rinominato in SettingsMenu.
  2. Con SettingsMenu selezionato, imposta le seguenti proprietà:

    Frame riposizionato, ridimensionato e stilizzato con uno sfondo blu navy trasparente.
  3. Inserisci un UIAspectRatioConstraint in SettingsMenu e imposta la sua proprietà AspectRatio su 2.5. (rapporto 2.5:1 tra larghezza e altezza).

    Finestra Explorer che mostra un nuovo UISizeConstraint inserito nel frame SettingsMenu.
    Finestra Proprietà che mostra i valori attesi per il nuovo UISizeConstraint.
  4. Inserisci un modificatore UICorner in SettingsMenu e imposta il suo CornerRadius su 0.1, 0.

    Finestra Explorer che mostra un nuovo UICorner inserito nel frame SettingsMenu.
    Finestra Proprietà che mostra i valori attesi per il nuovo modificatore UICorner.
  5. Per vincolare la larghezza e l'altezza in pixel di SettingsMenu, inserisci un UISizeConstraint. Imposta il suo MaxSize su 800, inf e il suo MinSize su 350, 0.

    Finestra Explorer che mostra un nuovo UISizeConstraint inserito nel frame SettingsMenu.
    Finestra Proprietà che mostra i valori attesi per il nuovo UISizeConstraint.
    Frame stilizzato con angoli arrotondati.

Costruisci un cursore

Per consentire ai giocatori di regolare i livelli di volume, il menu delle impostazioni conterrà due widget cursore trascinabili alimentati da UIDragDetector, un oggetto conveniente che facilita l'interazione con elementi dell'interfaccia utente 2D.


Per creare un contenitore genitore per il primo cursore:

  1. Inserisci un nuovo Frame nel contenitore SettingsMenu e rinominalo in EffectsVolumeSlider.

    Finestra Explorer che mostra un nuovo frame inserito nel frame SettingsMenu, rinominato in EffectsVolumeSlider.
  2. Con il frame EffectsVolumeSlider selezionato, imposta le seguenti proprietà:

    • AnchorPoint = 0.5 (ancora centrale)

    • BackgroundTransparency = 1 (completamente trasparente)

    • Position = 0.5, 0, 0.35, 0 (centro orizzontale e 35% dall'alto del contenitore)

    • Size = 0.8, 0, 0.1, 0 (80% della larghezza del contenitore e 10% della sua altezza)

      Frame vuoto inserito per contenere gli elementi del cursore.
  3. Inserisci un nuovo UIListLayout in EffectsVolumeSlider. Questo modificatore di layout è un modo potente per disporre automaticamente gli oggetti GuiObjects fratelli in righe orizzontali o colonne verticali all'interno del loro contenitore genitore, inclusa la possibilità di applicare concetti di flex.

    Finestra Explorer che mostra un nuovo UIListLayout inserito nel frame EffectsVolumeSlider.
  4. Imposta le seguenti proprietà per il nuovo UIListLayout:

    • Padding = 0.06, 0 (6% di padding tra gli elementi della lista)
    • FillDirection = Horizontal (disposizione da sinistra a destra degli elementi)
    • HorizontalFlex = Fill (ridimensiona gli elementi orizzontalmente per riempire l'intero contenitore genitore, sovrascrivendo la loro larghezza definita)
    • VerticalAlignment = Center (allinea gli elementi lungo il loro centro verticale)

Icona del cursore

Un'icona semplice che include una nota audio e un simbolo di "esplosione" aiuta i giocatori a identificare lo scopo del cursore quando aprono il menu delle impostazioni.

Icona che indica lo scopo del cursore nel menu delle impostazioni.
  1. Inserisci un ImageLabel nel frame EffectsVolumeSlider e rinominalo in Icon. Questa icona aiuterà i giocatori a capire quale aspetto del gioco controlla il cursore.

    Finestra Explorer che mostra un ImageLabel inserito nel frame EffectsVolumeSlider.
  2. Con Icon selezionato, imposta le seguenti proprietà:

    • BackgroundTransparency = 1 (completamente trasparente)
    • Size = 2.5, 0, 2.5, 0 (250% dell'altezza del frame genitore una volta vincolato il rapporto d'aspetto)
    • Image = rbxassetid://90019827067389 (ID asset della nota audio e simbolo di "esplosione")
  3. Inserisci un UIAspectRatioConstraint in Icon e lascia le sue proprietà come predefinite (rapporto 1:1 tra larghezza e altezza).

    Finestra Explorer che mostra un UIAspectRatioConstraint inserito nell'ImageLabel. Icona finalizzata nel menu delle impostazioni.

Frame di intervallo

Direttamente a destra dell'icona, la parte interattiva del cursore dovrebbe essere contenuta all'interno di un altro Frame.

Dimensione e posizione target della parte interattiva del cursore.
  1. Inserisci un nuovo Frame nel frame EffectsVolumeSlider e rinominalo in SliderFrame. Nota che deve essere un fratello diretto del modificatore di layout UIListLayout.

    Finestra Explorer che mostra un frame figlio inserito nel frame EffectsVolumeSlider.
  2. Con SliderFrame selezionato, imposta le seguenti proprietà:

  3. Inserisci i seguenti modificatori in SliderFrame:

    Frame del cursore posizionato a destra dell'icona.

Maniglia interattiva

Con il contenitore del cursore costruito, puoi ora creare una maniglia trascinabile con cui i giocatori possono interagire durante il gioco.

Maniglia interattiva del cursore posizionata all'interno del frame di intervallo.
  1. Inserisci un nuovo Frame nel contenitore SliderFrame e rinominalo in Handle.

    Finestra Explorer che mostra un frame figlio inserito nel frame SliderFrame e rinominato in Handle.
  2. Con Handle selezionato, imposta le seguenti proprietà:

    • AnchorPoint = 0.5 (ancora centrale)
    • Position = 0.5, 0, 0.5, 0 (centro orizzontale e verticale del frame genitore)
    • Size = 1.2, 0, 1.2, 0 (120% dell'altezza del frame genitore una volta vincolato il rapporto d'aspetto)
    • ZIndex = 3 (strato della maniglia visivamente davanti ad altri elementi del cursore)
  3. Inserisci i seguenti modificatori in Handle:

  4. Inserisci un oggetto UIDragDetector in Handle. Questo oggetto conveniente facilita e incoraggia l'interazione con elementi dell'interfaccia utente 2D.

    Finestra Explorer che mostra un UIDragDetector inserito nel frame Handle.
  5. Imposta le seguenti proprietà per il nuovo UIDragDetector:

  6. Per garantire che l'intervallo di trascinamento lineare della maniglia sia limitato al suo contenitore, collega la sua proprietà BoundingUI al contenitore SliderFrame:

    1. Seleziona il UIDragDetector.
    2. Fai clic sulla sua proprietà BoundingUI nella finestra Proprietà.
    3. Torna nella finestra Explorer e fai clic sul genitore SliderFrame della maniglia.
    Diagramma che mostra il processo di collegamento della proprietà BoundingUI del detector al contenitore SliderFrame.

    La proprietà BoundingUI ora riflette il contenitore SliderFrame:

    Finestra Proprietà che mostra la proprietà BoundingUI del detector collegata al contenitore SliderFrame.

Se ora provi a giocare al gioco, sarai in grado di trascinare la maniglia a sinistra e a destra all'interno del suo contenitore genitore:

Riempimento interno

Per indicare più chiaramente che il cursore controlla un intervallo dal 0% al 100%, puoi aggiungere un riempimento interno sul lato sinistro del contenitore che si sincronizzerà con la posizione variabile della maniglia.

Parte di riempimento interno del cursore inserita nel SliderFrame.
  1. Inserisci un nuovo Frame nel contenitore SliderFrame e rinominalo in InnerFill.

    Finestra Explorer che mostra un frame figlio inserito nel frame SliderFrame e rinominato in InnerFill.
  2. Imposta le seguenti proprietà per il frame InnerFill:

    • AnchorPoint = 0, 0.5 (bordo sinistro e centro verticale)
    • BackgroundColor3 = [0, 150, 255] (blu che corrisponde alla maniglia del cursore)
    • BackgroundTransparency = 0.35 (65% opaco)
    • Position = 0, 0, 0.5, 0
    • Size = 0.5, 0, 1, 0 (50% di larghezza e 100% di altezza del frame genitore)
    • ZIndex = 2 (strato visivamente davanti al riempimento/contorno del frame genitore)
  3. Per abbinare la forma "pillola" del contenitore genitore SliderFrame, inserisci un modificatore UICorner e imposta la sua proprietà CornerRadius su 0.5, 0.

    Finestra Explorer che mostra un modificatore UICorner inserito nel frame InnerFill.
    Finestra Proprietà che mostra i valori attesi per il nuovo UICorner.
    Frame InnerFill stilizzato con sfondo blu e angoli arrotondati.

Duplica il cursore

Con il primo cursore costruito, puoi facilmente duplicarlo e modificare alcuni aspetti visivi per indicare un altro scopo, in questo caso il livello di volume dell'audio di sottofondo simboleggiato da un'icona di note musicali.

Posizione target del cursore audio di sottofondo.
  1. Seleziona l'oggetto EffectsVolumeSlider completato.

    Finestra Explorer che mostra l'EffectsVolumeSlider completato selezionato.
  2. Duplica (CtrlD o D) e poi rinomina il duplicato in BackgroundVolumeSlider.

    Finestra Explorer che mostra il cursore duplicato rinominato in BackgroundVolumeSlider.
  3. Cambia la Position del duplicato in 0.5, 0, 0.7, 0 per spostarlo sotto il primo cursore.

    BackgroundVolumeSlider posizionato sotto EffectsVolumeSlider.
  4. Espandi il ramo di primo livello di BackgroundVolumeSlider, seleziona l'etichetta dell'immagine Icon e cambia la sua proprietà Image in rbxassetid://101125859760167 (ID asset del simbolo con note musicali).

    Finestra Explorer che mostra l'etichetta Icon all'interno di BackgroundVolumeSlider.
    Finestra Proprietà che mostra i valori attesi per l'etichetta Icon.
    BackgroundVolumeSlider con immagine dell'icona modificata.
  5. Espandi il ramo SliderFrameHandle, seleziona il modificatore UIStroke all'interno e imposta la sua proprietà Color su [255, 0, 125] (magenta).

    Finestra Explorer che mostra il modificatore UIStroke all'interno della maniglia di BackgroundVolumeSlider.
    Finestra Proprietà che mostra i valori attesi per il modificatore UIStroke.
    BackgroundVolumeSlider con immagine dell'icona modificata.
  6. Seleziona il frame InnerFill all'interno di SliderFrame e cambia la sua proprietà BackgroundColor3 nello stesso colore magenta ([255, 0, 125]).

    Finestra Explorer che mostra il frame InnerFill all'interno del contenitore SliderFrame di BackgroundVolumeSlider.
    Finestra Proprietà che mostra i valori attesi per il frame InnerFill.
    BackgroundVolumeSlider con colore InnerFill modificato.

Crea il pulsante di chiusura

L'ultimo elemento del menu delle impostazioni è un pulsante di chiusura che fornisce ai giocatori un'ulteriore input per chiudere il menu (il SettingsButton al centro in alto servirà allo stesso scopo).

Menu delle impostazioni con pulsante di chiusura indicato nell'angolo in alto a destra.
  1. Inserisci un nuovo ImageButton nel contenitore SettingsMenu e rinominalo in CloseButton.

    Finestra Explorer che mostra un nuovo ImageButton inserito in SettingsMenu e rinominato in CloseButton. ImageButton vuoto posizionato nell'angolo in alto a sinistra del menu delle impostazioni.
  2. Con CloseButton selezionato, imposta le seguenti proprietà:

    • AnchorPoint = 1, 0 (angolo in alto a destra)
    • BackgroundTransparency = 1 (completamente trasparente)
    • Position = 1, -10, 0, 10 (10 pixel di margine dall'angolo in alto a destra)
    • Size = 0.15, 0, 0.15, 0 (15% dell'altezza del frame una volta vincolato il rapporto d'aspetto)
    • Image = rbxassetid://5577404210 (ID asset del simbolo del pulsante di chiusura)
    • ImageTransparency = 0.25 (75% opaco)
  3. Inserisci un UIAspectRatioConstraint nel pulsante con proprietà predefinite (rapporto 1:1 tra larghezza e altezza).

    Finestra Explorer che mostra un UIAspectRatioConstraint inserito nel pulsante CloseButton. Pulsante di chiusura finalizzato nell'angolo in alto a destra del menu delle impostazioni.

Crea i moduli di controllo

Un setup di moduli di controllo estensibili rende la gestione dell'interfaccia utente interattiva più snella rispetto a script individuali posizionati all'interno di ciascun oggetto. ModuleScripts facilitano questa funzionalità estensibile consentendo di riutilizzare il codice tra script su lati diversi del confine client-server o sullo stesso lato del confine.

Controller di oggetti con stato

Il seguente modulo controller di oggetti con stato ti consente di allegare comportamenti agli oggetti UI come SettingsButton e SettingsMenu, e di attivare facilmente il passaggio tra vari stati. Per creare il modulo:

  1. Inserisci un ModuleScript nel contenitore ReplicatedStorage e rinominalo in StatefulObjectController.

    Finestra Explorer che mostra il modulo StatefulObjectController all'interno del contenitore ReplicatedStorage.
  2. Incolla il seguente codice all'interno del modulo:

    StatefulObjectController
    local TweenService = game:GetService("TweenService")
    local StatefulObjectController = {}
    StatefulObjectController.__index = StatefulObjectController
    export type StateName = string
    export type State = {
    transition: TweenInfo,
    properties: { [string]: any },
    }
    function StatefulObjectController.hydrate(props: {
    object: Instance,
    states: { [StateName]: State },
    initialStateName: StateName
    })
    local object, states, initialStateName = props.object, props.states, props.initialStateName
    local self = setmetatable({
    states = states,
    currentStateName = initialStateName,
    tweens = {},
    }, StatefulObjectController)
    -- Crea tweens per riutilizzo per evitare di creare nuovi tweens ogni volta che lo stato cambia
    for stateName, state in states do
    self.tweens[stateName] = TweenService:Create(object, state.transition, state.properties)
    end
    self:setState(self.currentStateName)
    return self
    end
    function StatefulObjectController:setState(stateName: StateName)
    local stateTween: Tween = self.tweens[stateName]
    if not stateTween then
    warn(string.format("Tentativo di impostare %s su stato sconosciuto '%s'", self.object:GetFullName(), stateName))
    return
    end
    self.currentStateName = stateName
    -- Assicurati che altri tweens non siano in conflitto
    for _, tween in self.tweens do
    tween:Cancel()
    end
    stateTween:Play()
    end
    return StatefulObjectController
    LineeScopo
    610Definisce ed esporta i tipi Luau per migliorare l'autocompletamento e il linting quando si utilizza questo modulo.
    1233Funzione utilizzata per inizializzare e allegare comportamenti a un oggetto UI con stato, accettando un GuiObject come object, una tabella di stati e i rispettivi dati TweenInfo, e un nome di stato iniziale. All'interno di questa funzione, le righe 2628 costruiscono Tweens per ciascuno stato, e la riga 30 chiama la funzione setState() del modulo per impostare l'oggetto nello stato iniziale.
    3550Funzione utilizzata per impostare/cambiare lo stato di un oggetto con stato. La riga 42 imposta il currentStateName dell'oggetto sullo stato impostato, le righe 4547 annullano eventuali tweens in esecuzione per prevenire conflitti, e la riga 49 esegue il tween dello stato.

Controller del cursore

Un modulo aggiuntivo inizializza e controlla i due cursori di volume. Consente anche di collegare una funzione di callback a ciascun cursore per rilevare l'interazione del giocatore con il cursore e applicare le modifiche desiderate nel gioco.

  1. Inserisci un ModuleScript nel contenitore ReplicatedStorage e rinominalo in SliderController.

    Finestra Explorer che mostra il modulo SliderController all'interno del contenitore ReplicatedStorage.
  2. Incolla il seguente codice all'interno del modulo:

    SliderController
    local SliderController = {}
    SliderController.__index = SliderController
    export type Value = number
    export type OnChanged = (Value) -> ()
    function SliderController.hydrate(props: {
    object: Instance,
    onChanged: OnChanged,
    initialValue: Value?
    })
    local object, onChanged, initialValue = props.object, props.onChanged, props.initialValue
    local handle = object:FindFirstChild("Handle", true)
    if not handle then
    warn(string.format("Tentativo di idratare il cursore %s ma non è stato possibile trovare Handle", object:GetFullName()))
    end
    local innerFill = object:FindFirstChild("InnerFill", true)
    if not innerFill then
    warn(string.format("Tentativo di idratare il cursore %s ma non è stato possibile trovare InnerFill", object:GetFullName()))
    end
    local dragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
    if not dragDetector then
    warn(string.format("Tentativo di idratare il cursore %s ma non è stato possibile trovare UIDragDetector", object:GetFullName()))
    end
    local self = setmetatable({
    handle = handle,
    innerFill = innerFill,
    dragDetector = dragDetector,
    value = initialValue or 0.5,
    onChanged = onChanged,
    }, SliderController)
    -- Imposta il valore iniziale
    self:setValue(self.value)
    -- Collega il detector alla manipolazione del giocatore
    self.dragConnection = dragDetector.DragContinue:Connect(function()
    self:setValue(handle.Position.X.Scale)
    end)
    return self
    end
    function SliderController:setValue(value: Value)
    local clampedValue = math.clamp(value, 0, 1)
    self.value = clampedValue
    -- Aggiorna la posizione della maniglia e la dimensione del riempimento interno per corrispondere
    self.handle.Position = UDim2.fromScale(clampedValue, 0.5)
    self.innerFill.Size = UDim2.fromScale(clampedValue, 1)
    -- Esegui la callback dell'utente con l'ultimo valore
    local changeSuccess, changeResult = pcall(self.onChanged, clampedValue)
    if not changeSuccess then
    warn("Errore nella callback del cursore:", changeResult)
    end
    end
    return SliderController
    LineeScopo
    746Funzione utilizzata per inizializzare e allegare comportamenti a un elemento cursore, accettando il Frame genitore del cursore come object, una funzione di callback onChanged per elaborare le modifiche del cursore, e un valore iniziale per la posizione della maniglia del cursore. All'interno della funzione, le righe 1427 confermano che gli elementi maniglia, riempimento interno e UIDragDetector del cursore esistono. La riga 38 chiama la funzione setValue() del modulo e le righe 4143 collegano l'evento DragContinue del detector alla funzione setValue() del modulo (vedi la riga successiva per i dettagli).
    4861Funzione utilizzata per impostare il valore del cursore. All'interno della funzione, le righe 5354 assicurano che la posizione della maniglia e la dimensione del riempimento interno siano sincronizzate, e la riga 57 passa il valore cambiato alla funzione di callback in modo da poter utilizzare il valore come necessario.

Crea lo script delle impostazioni

Con il pulsante delle impostazioni e il menu delle impostazioni finalizzati, puoi collegare tutto insieme con un singolo script che utilizza i moduli di controllo.

  1. Inserisci un nuovo LocalScript in HUDContainer e rinominalo in SettingsScript per descriverne lo scopo. Nota che questo script dovrebbe essere allo stesso livello (fratello) di SettingsMenu e SettingsButton, gli oggetti UI di primo livello che gestirà.

    Finestra Explorer che mostra lo script SettingsScript all'interno del contenitore HUDContainer.
  2. Incolla il seguente codice all'interno dello script:

    SettingsScript
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local SoundService = game:GetService("SoundService")
    local SliderController = require(ReplicatedStorage.SliderController)
    local StatefulObjectController = require(ReplicatedStorage.StatefulObjectController)
    local HUDContainer = script.Parent
    -- Inizializza il pulsante delle impostazioni
    local settingsButton = StatefulObjectController.hydrate({
    object = HUDContainer:FindFirstChild("SettingsButton"),
    states = {
    menuOpen = {
    transition = TweenInfo.new(0.5, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out),
    properties = {
    Rotation = 45,
    },
    },
    menuClosed = {
    transition = TweenInfo.new(0.5, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out),
    properties = {
    Rotation = 0,
    },
    },
    },
    initialStateName = "menuClosed"
    })
    -- Inizializza il frame del menu delle impostazioni
    local settingsMenu = StatefulObjectController.hydrate({
    object = HUDContainer:FindFirstChild("SettingsMenu"),
    states = {
    menuOpen = {
    transition = TweenInfo.new(0.5, Enum.EasingStyle.Bounce, Enum.EasingDirection.Out),
    properties = {
    Position = UDim2.fromScale(0.5, 0.5),
    Visible = true,
    },
    },
    menuClosed = {
    transition = TweenInfo.new(0),
    properties = {
    Position = UDim2.fromScale(0.5, 0.4),
    Visible = false,
    },
    },
    },
    initialStateName = "menuClosed"
    })
    -- Inizializza il cursore del volume degli effetti
    local effectsAudio = SoundService:FindFirstChild("Effects")
    local effectsVolumeSlider = SliderController.hydrate({
    object = HUDContainer:FindFirstChild("EffectsVolumeSlider", true),
    initialValue = effectsAudio and effectsAudio.Volume or 0.5,
    onChanged = function(value: SliderController.Value)
    if effectsAudio then
    effectsAudio.Volume = value
    end
    end,
    })
    -- Inizializza il cursore del volume di sottofondo
    local backgroundAudio = SoundService:FindFirstChild("Background")
    local backgroundVolumeSlider = SliderController.hydrate({
    object = HUDContainer:FindFirstChild("BackgroundVolumeSlider", true),
    initialValue = backgroundAudio and backgroundAudio.Volume or 0.5,
    onChanged = function(value: SliderController.Value)
    if backgroundAudio then
    backgroundAudio.Volume = value
    end
    end,
    })
    -- Collega i pulsanti all'interazione del giocatore
    HUDContainer:FindFirstChild("SettingsButton").Activated:Connect(function()
    local targetState = if settingsButton.currentStateName == "menuClosed"
    then "menuOpen"
    else "menuClosed"
    settingsButton:setState(targetState)
    settingsMenu:setState(targetState)
    end)
    HUDContainer:FindFirstChild("CloseButton", true).Activated:Connect(function()
    settingsButton:setState("menuClosed")
    settingsMenu:setState("menuClosed")
    end)
  3. Riferisciti alle seguenti sezioni per esplorare come lo script utilizza i moduli di controllo.

    Le righe 10-27 inizializzano e allegano comportamenti al pulsante delle impostazioni come segue:

    LineeScopo
    1011Viene dichiarato un riferimento locale settingsButton e idratato con la funzione StatefulObjectController.hydrate(), e il pulsante SettingsButton all'interno di HUDContainer viene referenziato come oggetto da idratare.
    1225Viene passata una tabella states con due stati unici, menuOpen e menuClosed. Ogni stato contiene una transizione per dichiarare (attraverso un TweenInfo) come il particolare stato raggiungerà le proprietà target definite nella tabella properties. In questo caso, menuOpen dichiara un cambiamento di stato a 45° per la Rotation del pulsante con un tween di Exponential di ½ secondo, mentre menuClosed ripristina effettivamente il pulsante alla sua rotazione predefinita di 0.
    26Lo stato iniziale del pulsante è impostato su menuClosed (questo potrebbe essere impostato su qualsiasi nome di stato all'interno della tabella states).

    Più in basso nello script (righe 76-86), i pulsanti sono collegati all'interazione del giocatore per attivare i cambiamenti di stato dell'interfaccia utente:

    LineeScopo
    7682SettingsButton è collegato all'evento Activated della classe GuiButton per chiamare una funzione anonima. All'interno della funzione anonima, le righe 7779 alternano una variabile targetState tra menuOpen e menuClosed. La riga 80 chiama quindi setState() per impostare lo stato del pulsante su targetState e la riga `81 fa lo stesso per SettingsMenu in modo che si apra o si chiuda con l'attivazione di SettingsButton.
    8386CloseButton è collegato all'evento Activated per chiamare una funzione anonima che imposta lo stato di entrambi SettingsButton e SettingsMenu su menuClosed.

    Le righe 30-49 inizializzano e allegano comportamenti al menu delle impostazioni come segue:

    LineeScopo
    3031Viene dichiarato un riferimento locale settingsMenu e idratato con la funzione StatefulObjectController.hydrate() e il frame SettingsMenu all'interno di HUDContainer viene referenziato come oggetto da idratare.
    3246Simile al pulsante delle impostazioni, viene passata una tabella states con due stati unici, menuOpen e menuClosed. Qui, menuOpen dichiara un cambiamento di stato a UDim2.fromScale(0.5, 0.5) per la Position del frame con un tween di Bounce di ½ secondo, così come uno stato Visible di true. Al contrario, menuClosed dichiara un cambiamento di stato posizionale a UDim2.fromScale(0.5, 0.4) e Visible su false, ma il TweenInfo con durata 0 alla riga 41 rende effettivamente il cambiamento di stato istantaneo.
    48Lo stato iniziale del frame è impostato su menuClosed.

    Più in basso nello script (righe 76-86), il menu delle impostazioni è collegato all'interazione del giocatore:

    LineeScopo
    81Imposta lo stesso targetState per SettingsMenu per sincronizzarsi con l'attivazione di SettingsButton.
    85Imposta lo stato di SettingsMenu su menuClosed quando CloseButton viene attivato.

    Le righe 51-73 inizializzano e allegano comportamenti a EffectsVolumeSlider e BackgroundVolumeSlider come segue:

    LineeScopo
    52Imposta un riferimento locale al SoundGroup Effects all'interno di SoundService. Un SoundGroup consente di interrelare più Sounds e controllare il volume di ogni suono nel gruppo attraverso la proprietà Volume del gruppo.
    5354Viene dichiarato un riferimento locale effectsVolumeSlider e idratato con la funzione SliderController.hydrate() e il frame EffectsVolumeSlider all'interno di HUDContainer ⟩ SettingsMenu viene referenziato come oggetto da idratare. Nota che il secondo parametro di true per FindFirstChild() dice al metodo di cercare ricorsivamente lungo il ramo HUDContainer per localizzare EffectsVolumeSlider.
    55Il valore iniziale del cursore è impostato sul valore attuale di Volume del gruppo Effects, o 0.5 come fallback.
    5660Stabilisce la funzione di callback per applicare le modifiche del valore del cursore al volume del gruppo Effects.
    6473Fondamentalmente lo stesso delle righe 52-61, tranne per idratare il frame BackgroundVolumeSlider all'interno di HUDContainer ⟩ SettingsMenu e applicare le modifiche del valore del cursore al volume del gruppo Background.

Con SettingsScript in posizione, il gioco ora offre un esempio di interfaccia utente interattiva completamente operativo che collega un insieme correlato di oggetti UI all'interazione del giocatore.

© 2026 Roblox Corporation. Roblox, il logo Roblox e Powering Imagination sono tra i nostri marchi registrati e non registrati negli Stati Uniti. e altri paesi.