Rendere le esperienze interattive spesso significa manipolare le proprietà e gli attributi dell'oggetto:
Le proprietà sono parte della classe oggetto.Ad esempio, la proprietà BasePart.Anchored controlla la fisica per la parte.In un'esperienza di pista e campo, potresti voler ancorare un disco o un giavellotto al momento in cui atterra così che i giocatori abbiano un indicatore visivo di quanto è viaggiato.
Gli attributi sono essenzialmente proprietà personalizzate che definisci.Ad esempio, il progetto di riferimento Pianta utilizza gli attributi per impostare il prezzo d'acquisto per i semi e la dimensione massima della pianta che un vaso può contenere.
Ordine di replicazione
Prima di iniziare a recuperare e manipolare gli oggetti, devi avere una comprensione dell'ordine di replicazione.
Il motore Roblox non garantisce l'ordine in cui gli oggetti vengono replicati dal server al client, il che rende il metodo Instance:WaitForChild() essenziale per accedere agli oggetti negli script del client, in particolare gli oggetti nel Workspace.Tuttavia, alcuni aspetti del processo sono prevedibili:
Il client carica i contenuti di ReplicatedFirst , come una schermata di caricamento, risorse e script.
LocalScripts (e Scripts con un RunContext di Client ) in ReplicatedFirst Eseguire.Questi script possono ottenere in sicurezza oggetti da ReplicatedFirst senza usare WaitForChild() :
-- Sicurolocal ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)Questi script non possono ottenere in sicurezza oggetti da altri servizi, perché potrebbero non essere ancora stati carati:
-- Non sicurolocal ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)Puoi usare WaitForChild() per ottenere oggetti da altri servizi, ma facendo così si negano i vantaggi dell'utilizzo di ReplicatedFirst .
Il client continua a caricare il resto dell'esperienza.
Quando termina, l'evento game.Loaded si attiva e game:IsLoaded() restituisce vero.
LocalScripts in Players.Player.PlayerScripts (copiato da StarterPlayerScripts ) Eseguire, così come il client Scripts in ReplicatedStorage .Questi script possono ottenere in sicurezza oggetti da ReplicatedStorage senza usare WaitForChild() .
Il modello del GiocatoreCharacter si genera nell'esperienza.
LocalScripts in Workspace.Character (copiato da StarterCharacterScripts ) eseguire.
Se la tua esperienza utilizza streaming dell'istanza ( Workspace.StreamingEnabled ), alcuni o la maggior parte degli oggetti potrebbero non essere stati caricati nell'area di lavoro, quindi l'uso di WaitForChild() per accedere agli oggetti dell'area di lavoro diventa una misura di sicurezza ancora più importante.In particolare, vedi Stream in e controlli di streaming per modello aggiuntivi per ulteriori informazioni sul caricamento e sul tuning del comportamento di streaming.
Ottieni oggetti
Il primo passo per modificare le proprietà e gli attributi dell'oggetto è ottenere un riferimento all'oggetto.La soluzione più semplice è quella di rendere lo script un figlio dell'oggetto nell'esploratore e utilizzare script.Parent per fare riferimento 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")
Modifica proprietà
Le proprietà sono semplici da accedere — basta usare un . dopo il riferimento all'oggetto — anche 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)
Crea attributi
Sebbene tu possa creare attributi in modo programmatico, la soluzione più comune è crearli con valori predefiniti nell'interfaccia utente Studio.Quindi puoi usare gli script per modificare i loro valori in risposta alle azioni del giocatore.

Per informazioni sulla creazione di attributi in Studio, vedi Attributi dell'istanza.
Imposta attributi
Per modificare il valore di un attributo, chiama Instance:SetAttribute() con un nome e un valore.
Crea o Modifica Attributo
local cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)
Se l'attributo non esiste già, questo metodo lo crea.
Ottieni i valori degli attributi
Per ottenere il valore di un attributo esistente, chiama Instance:GetAttribute() sull'esempio.
Ottieni il valore dell'attributo
local 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 attributi
local cabbage = script.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Elimina attributi
Per eliminare un attributo, imposta il suo valore a nil .
Elimina attributo
local cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
Rileva le modifiche
Esistono diversi modi per ascoltare le modifiche alle proprietà e agli 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 proprietà e non passa parametri.
- Il metodo Instance:GetAttributeChangedSignal() ti consente di ascoltare le modifiche a un attributo e non passa parametri.
A causa delle informazioni minime che questi eventi e metodi passano come parametri, tutti sono una buona alternativa per le funzioni anonime, in particolare Instance:GetPropertyChangedSignal() e Instance:GetAttributeChangedSignal().Per saperne di più sulle funzioni anonime e sul lavoro con gli eventi, vedi Eventi.
Ascolta le modifiche
local cabbage = script.Parent
-- Funzioni locali
local function onAnyPropertyChange(property)
-- Ignora le modifiche agli attributi
if property ~= "Attributes" then
print(property) --> Nome
print(cabbage[property]) --> Cavolo1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Crescere, Tasso di crescita
print(cabbage:GetAttribute(attribute)) --> falso, 3
end
-- Ascolta i cambiamenti e connetti alle funzioni locali
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Ascolta le modifiche e connetti a funzioni anonime
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Cavolo1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Fuochi modificati e GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Fuochi modificati e AttributeChanged
cabbage:SetAttribute("Grow", false)
-- Fiamme modificate, AttributeChanged e GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)