Proprietà e attributi

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

Rendere i giochi interattivi spesso significa manipolare le proprietà e gli attributi degli oggetti:

  • Le proprietà fanno parte della classe degli oggetti. Ad esempio, la proprietà BasePart.Anchored controlla la fisica per la parte. In un gioco di atletica, potresti voler bloccare un disco o un giavellotto nel momento in cui atterra, in modo che i giocatori abbiano un indicatore visivo di quanto è lontano arrivato.

  • Gli attributi sono essenzialmente proprietà personalizzate che definisci. Ad esempio, il progetto di riferimento Plant utilizza attributi per impostare il prezzo d'acquisto per i semi e la dimensione massima della pianta che un vaso può contenere.

Ordine di replica

Prima di iniziare a recuperare e manipolare oggetti, devi avere una comprensione dell'ordine di replica.

Il motore Roblox non garantisce l'ordine in cui gli oggetti (e le modifiche agli oggetti) vengono replicati dal server al client, il che rende il metodo Instance:WaitForChild() essenziale per accedere agli oggetti negli script client, in particolare agli oggetti in Workspace.

Ad esempio, se uno script del server modifica una proprietà di un'istanza nella Workspace e poi chiama RemoteEvent:FireAllClients(), la modifica della proprietà potrebbe replicarsi al client prima o dopo che RemoteEvent.OnClientEvent viene attivato. Usa i metodi e gli eventi disponibili per rilevare le modifiche piuttosto che assumere che una modifica sia stata replicata. Le modifiche dello stesso tipo, come due modifiche agli attributi, generalmente arrivano in ordine.

Quando i client avviano per la prima volta un gioco, alcuni aspetti della replica e dell'esecuzione degli script sono prevedibili:

  1. Il client carica i contenuti di ReplicatedFirst, come una schermata di caricamento, asset e script.

  2. Gli LocalScripts (e Scripts con un RunContext di Client) in ReplicatedFirst vengono eseguiti. Questi script possono in sicurezza ottenere oggetti da ReplicatedFirst senza usare Instance:WaitForChild():


    -- Sicuro
    local ReplicatedFirst = game:GetService("ReplicatedFirst")
    local LoadingScreen = require(ReplicatedFirst.LoadingScreen)

    Questi script non possono in sicurezza ottenere oggetti da altri servizi, perché potrebbero non essere stati ancora caricati:


    -- Non sicuro
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local PickupManager = require(ReplicatedStorage.PickupManager)

    Puoi usare WaitForChild() in questi script per ottenere oggetti da altri servizi, ma farlo annulla i benefici di utilizzare ReplicatedFirst.

  3. Il client continua a caricare il resto del gioco.

  4. Quando termina, si attiva l'evento Loaded e IsLoaded() restituisce true.

  5. Gli LocalScripts in Players.[Player].PlayerScripts (copia da StarterPlayerScripts) vengono eseguiti, così come gli Scripts client in ReplicatedStorage. Questi script possono in sicurezza ottenere oggetti da ReplicatedStorage senza usare WaitForChild().

  6. Il modello Character del giocatore si genera nel gioco.

  7. Gli LocalScripts in Workspace.[Character] (copia da StarterCharacterScripts) vengono eseguiti.

Se il tuo gioco utilizza streaming di istanze (Workspace.StreamingEnabled), alcuni o la maggior parte degli oggetti potrebbero non essere stati caricati nella workspace, quindi utilizzare WaitForChild() per accedere agli oggetti nella workspace diventa una misura di sicurezza ancora più importante. In particolare, vedere stream in e controlli di streaming per modello per ulteriori informazioni su caricamento e ottimizzazione del comportamento di streaming.

Ottenere oggetti

Il primo passo per modificare le proprietà e gli attributi degli oggetti è ottenere un riferimento all'oggetto. La soluzione più semplice è fare in modo che lo script sia un figlio dell'oggetto nell'Esplora e utilizzare script.Parent per riferirsi all'oggetto.

Uno script figlio di un modello nell'Explorer.

local sign = script.Parent

La soluzione più universale è ottenere l'oggetto da un servizio utilizzando metodi come Instance:FindFirstChild() o Instance:WaitForChild().

Un Modello all'interno di una Cartella in ReplicatedStorage.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local signsFolder = ReplicatedStorage:WaitForChild("Signs")
local sign = signsFolder:WaitForChild("InteractiveSign")

Modificare proprietà

Le proprietà sono semplici da accedere: basta usare un . dopo il riferimento all'oggetto — anche se se stai lavorando con un modello, potresti dover scegliere una parte individuale piuttosto che il modello stesso.

Un Modello all'interno di ReplicatedStorage.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local chair = ReplicatedStorage:WaitForChild("Chair")
chair.LeftArmRest.Size = Vector3.new(10, 1, 10)

Creare attributi

Sebbene tu possa creare attributi programmaticamente, la soluzione più comune è crearli con valori predefiniti nell'interfaccia utente di Studio. Quindi puoi utilizzare gli script per modificare i loro valori in risposta alle azioni dei giocatori.

Uno script all'interno di una cartella in ReplicatedStorage.

Per informazioni su come creare attributi in Studio, vedere attributi delle istanze.

Impostare attributi

Per modificare il valore di un attributo, chiama Instance:SetAttribute() con un nome e un valore.

Crea o Modifica Attributo

local cabbage = script.Parent
cabbage:SetAttribute("Harvestable", true)

Se l'attributo non esiste già, questo metodo lo crea.

Ottenere valori degli attributi

Per ottenere il valore di un attributo esistente, chiama Instance:GetAttribute() sull'istanza.

Ottieni Valore Attributo

local cabbage = script.Parent
cabbage:SetAttribute("Harvestable", true)
local isHarvestable = cabbage:GetAttribute("Harvestable")
print(isHarvestable) --> true

Allo stesso modo, puoi ottenere tutti gli attributi chiamando Instance:GetAttributes(). Questo metodo restituisce un dizionario di coppie chiave-valore.

Ottieni Tutti gli Attributi

local cabbage = script.Parent
local cabbageAttributes = cabbage:GetAttributes()
print(cabbageAttributes.GrowthRate) --> 2
for k, v in cabbageAttributes do
print(k, v)
end

Eliminare attributi

Per eliminare un attributo, imposta il suo valore su nil.

Elimina Attributo

local cabbage = script.Parent
cabbage:SetAttribute("GrowthRate", nil)

Rilevare modifiche

Ci sono diversi modi per ascoltare le modifiche a proprietà e attributi:

A causa delle informazioni minime che questi eventi e metodi passano come parametri, tutti sono adatti per funzioni anonime, in particolare Instance:GetPropertyChangedSignal() e Instance:GetAttributeChangedSignal(). Per saperne di più su funzioni anonime e su come lavorare con eventi, vedere Eventi.

Ascolta per Modifiche

local cabbage = script.Parent
-- Funzioni locali
local function onAnyPropertyChange(property)
-- Ignora le modifiche agli attributi
if property ~= "Attributes" then
print(property) --> Name
print(cabbage[property]) --> Cabbage1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Grow, GrowthRate
print(cabbage:GetAttribute(attribute)) --> false, 3
end
-- Ascolta le modifiche e collega a funzioni locali
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Ascolta le modifiche e collega a funzioni anonime
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Cabbage1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Attiva Changed e GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Attiva Changed e AttributeChanged
cabbage:SetAttribute("Grow", false)
-- Attiva Changed, AttributeChanged, e GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)
© 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.