Het interactief maken van games betekent vaak het manipuleren van objecteigenschappen en -attributen:
Eigenschappen maken deel uit van de objectklasse. Bijvoorbeeld, de BasePart.Anchored eigenschap controleert de fysica voor het onderdeel. In een atletiekspel wil je misschien een discus of speer verankeren op het moment dat deze landt, zodat spelers een visuele indicator hebben van hoe ver deze is gevlogen.
Attributen zijn in wezen aangepaste eigenschappen die je definieert. Bijvoorbeeld, het Plant referentieproject gebruikt attributen om de aankoopprijs voor zaden en de maximale plantgrootte die een pot kan bevatten in te stellen.
Replicatievolgorde
Voordat je begint met het ophalen en manipuleren van objecten, moet je een begrip hebben van de replicatievolgorde.
De Roblox Engine garandeert niet de volgorde waarin objecten (en wijzigingen aan objecten) worden gerepliceerd van de server naar de client, wat de Instance:WaitForChild() methode essentieel maakt voor het toegang krijgen tot objecten in clientscripts, met name objecten in de Workspace.
Bijvoorbeeld, als een serverscript een eigenschap van een instantie in de Workspace wijzigt en vervolgens RemoteEvent:FireAllClients() aanroept, kan de wijziging van de eigenschap naar de client repliceren voordat of nadat RemoteEvent.OnClientEvent wordt geactiveerd. Gebruik de beschikbare methoden en evenementen om wijzigingen te detecteren in plaats van aan te nemen dat een wijziging is gerepliceerd. Wijzigingen van hetzelfde type, zoals twee attribuutwijzigingen, komen over het algemeen wel in volgorde aan.
Wanneer clients voor het eerst een game starten, zijn sommige aspecten van replicatie en scriptuitvoering voorspelbaar:
De client laadt de inhoud van ReplicatedFirst, zoals een laadscherm, assets en scripts.
LocalScripts (en Scripts met een RunContext van Client) in ReplicatedFirst worden uitgevoerd. Deze scripts kunnen veilig objecten ophalen uit ReplicatedFirst zonder Instance:WaitForChild() te gebruiken:
-- Veiliglocal ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)Deze scripts kunnen niet veilig objecten ophalen uit andere services, omdat deze mogelijk nog niet zijn geladen:
-- Niet veiliglocal ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)Je kunt WaitForChild() in deze scripts gebruiken om objecten uit andere services op te halen, maar dit tenietdoet de voordelen van het gebruik van ReplicatedFirst.
De client gaat verder met het laden van de rest van de game.
Wanneer het klaar is, wordt het Loaded evenement geactiveerd en retourneert IsLoaded() waar.
LocalScripts in Players.[Player].PlayerScripts (gekopieerd van StarterPlayerScripts) worden uitgevoerd, evenals client Scripts in ReplicatedStorage. Deze scripts kunnen veilig objecten ophalen uit ReplicatedStorage zonder WaitForChild() te gebruiken.
Het Character model van de speler verschijnt in de game.
LocalScripts in Workspace.[Character] (gekopieerd van StarterCharacterScripts) worden uitgevoerd.
Als je game instantie-streaming (Workspace.StreamingEnabled) gebruikt, zijn sommige of de meeste objecten mogelijk nog niet in de workspace geladen, zodat het gebruik van WaitForChild() om toegang te krijgen tot workspace-objecten een nog belangrijkere veiligheidsmaatregel wordt. Zie in het bijzonder stream in en per-model streamingcontroles voor aanvullende informatie over het laden en afstemmen van streaminggedrag.
Objecten ophalen
De eerste stap om objecteigenschappen en -attributen te wijzigen is het verkrijgen van een referentie naar het object. De eenvoudigste oplossing is om het script een kind van het object in de Explorer te maken en script.Parent te gebruiken om naar het object te verwijzen.

local sign = script.ParentDe meer universele oplossing is om het object uit een service te halen met methoden zoals Instance:FindFirstChild() of Instance:WaitForChild().

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local signsFolder = ReplicatedStorage:WaitForChild("Signs")
local sign = signsFolder:WaitForChild("InteractiveSign")Eigenschappen wijzigen
Eigenschappen zijn eenvoudig toegankelijk — gebruik gewoon een . na de objectreferentie — hoewel je, als je met een model werkt, misschien een individueel onderdeel moet kiezen in plaats van het model zelf.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local chair = ReplicatedStorage:WaitForChild("Chair")
chair.LeftArmRest.Size = Vector3.new(10, 1, 10)Attributen aanmaken
Hoewel je attributen programmatisch kunt aanmaken, is de meer gebruikelijke oplossing om ze met standaardwaarden in de Studio-gebruikersinterface aan te maken. Vervolgens kun je scripts gebruiken om hun waarden te wijzigen als reactie op spelersacties.

Voor informatie over het aanmaken van attributen in Studio, zie instantie-attributen.
Attributen instellen
Om de waarde van een attribuut te wijzigen, roep je Instance:SetAttribute() aan met een naam en waarde.
local cabbage = script.Parent
cabbage:SetAttribute("Harvestable", true)Als het attribuut nog niet bestaat, maakt deze methode het aan.
Attribuutwaarden ophalen
Om de waarde van één bestaand attribuut op te halen, roep je Instance:GetAttribute() aan op de instantie.
local cabbage = script.Parent
cabbage:SetAttribute("Harvestable", true)
local isHarvestable = cabbage:GetAttribute("Harvestable")
print(isHarvestable) --> trueEvenzo kun je alle attributen ophalen door Instance:GetAttributes() aan te roepen. Deze methode retourneert een woordenboek van sleutel-waarde paren.
local cabbage = script.Parent
local cabbageAttributes = cabbage:GetAttributes()
print(cabbageAttributes.GrowthRate) --> 2
for k, v in cabbageAttributes do
print(k, v)
endAttributen verwijderen
Om een attribuut te verwijderen, stel je de waarde in op nil.
local cabbage = script.Parent
cabbage:SetAttribute("GrowthRate", nil)Wijzigingen detecteren
Er zijn verschillende manieren om te luisteren naar wijzigingen in eigenschappen en attributen:
- Het Instance.AttributeChanged evenement luistert naar wijzigingen in elk attribuut en geeft de naam van het gewijzigde attribuut door als parameter.
- De Instance:GetPropertyChangedSignal() methode laat je luisteren naar wijzigingen in één eigenschap en geeft geen parameters door.
- De Instance:GetAttributeChangedSignal() methode laat je luisteren naar wijzigingen in één attribuut en geeft geen parameters door.
Vanwege de minimale informatie die deze evenementen en methoden als parameters doorgeven, zijn ze allemaal goed geschikt voor anonieme functies, met name Instance:GetPropertyChangedSignal() en Instance:GetAttributeChangedSignal(). Om meer te leren over anonieme functies en het werken met evenementen, zie Evenementen.
local cabbage = script.Parent
-- Lokale functies
local function onAnyPropertyChange(property)
-- Negeer wijzigingen in attributen
if property ~= "Attributes" then
print(property) --> Naam
print(cabbage[property]) --> Cabbage1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Grow, GrowthRate
print(cabbage:GetAttribute(attribute)) --> false, 3
end
-- Luister naar wijzigingen en verbind met lokale functies
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Luister naar wijzigingen en verbind met anonieme functies
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Cabbage1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Activeert Changed en GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Activeert Changed en AttributeChanged
cabbage:SetAttribute("Grow", false)
-- Activeert Changed, AttributeChanged, en GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)