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:
Il client carica i contenuti di ReplicatedFirst, come una schermata di caricamento, asset e script.
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():
-- Sicurolocal 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 sicurolocal 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.
Il client continua a caricare il resto del gioco.
Quando termina, si attiva l'evento Loaded e IsLoaded() restituisce true.
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().
Il modello Character del giocatore si genera nel gioco.
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.

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

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.

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.

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 Attributolocal cabbage = script.Parentcabbage: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 Attributolocal cabbage = script.Parentcabbage: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 Attributilocal cabbage = script.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Eliminare attributi
Per eliminare un attributo, imposta il suo valore su nil.
Elimina Attributolocal cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
Rilevare modifiche
Ci sono diversi modi per ascoltare le modifiche a proprietà e attributi:
- L'evento Instance.AttributeChanged ascolta le modifiche a qualsiasi attributo e passa il nome dell'attributo modificato come parametro.
- Il metodo Instance:GetPropertyChangedSignal() ti consente di ascoltare le modifiche a una singola proprietà e non passa parametri.
- Il metodo Instance:GetAttributeChangedSignal() ti consente di ascoltare le modifiche a un singolo attributo e non passa parametri.
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)