Eigenschappen en attributen

*Deze inhoud is vertaald met behulp van AI (bèta) en kan fouten bevatten. Klik hier om deze pagina in het Engels te bekijken.

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:

  1. De client laadt de inhoud van ReplicatedFirst, zoals een laadscherm, assets en scripts.

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

    -- Veilig
    local 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 veilig
    local 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.

  3. De client gaat verder met het laden van de rest van de game.

  4. Wanneer het klaar is, wordt het Loaded evenement geactiveerd en retourneert IsLoaded() waar.

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

  6. Het Character model van de speler verschijnt in de game.

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

Een script dat aan een model in de Explorer is gekoppeld.
local sign = script.Parent

De meer universele oplossing is om het object uit een service te halen met methoden zoals Instance:FindFirstChild() of Instance:WaitForChild().

Een Model binnen een Map in ReplicatedStorage.
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.

Een Model binnen ReplicatedStorage.
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.

Een script binnen een map in ReplicatedStorage.

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.

Attribuut aanmaken of wijzigen
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.

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

Evenzo kun je alle attributen ophalen door Instance:GetAttributes() aan te roepen. Deze methode retourneert een woordenboek van sleutel-waarde paren.

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

Attributen verwijderen

Om een attribuut te verwijderen, stel je de waarde in op nil.

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

Wijzigingen detecteren

Er zijn verschillende manieren om te luisteren naar wijzigingen in eigenschappen en attributen:

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.

Luister naar wijzigingen
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)
©2026 Roblox Corporation. Roblox, het Roblox-logo en Powering Imagination behoren tot onze geregistreerde en niet-geregistreerde handelsmerken in de VS en andere landen.