Proprietà e attributi

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

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:

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

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


    -- Sicuro
    local 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 sicuro
    local 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 .

  3. Il client continua a caricare il resto dell'esperienza.

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

  5. 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() .

  6. Il modello del GiocatoreCharacter si genera nell'esperienza.

  7. 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.

A script parented to a model in the Explorer.

local sign = script.Parent

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

A Model within a Folder in ReplicatedStorage.

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.

A Model within ReplicatedStorage.

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.

A script within a folder in ReplicatedStorage.

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.Parent
cabbage: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.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

Elimina attributi

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

Elimina attributo

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

Rileva le modifiche

Esistono diversi modi per ascoltare le modifiche alle proprietà e agli attributi:

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)