Spiele interaktiv zu gestalten bedeutet oft, Objekt Eigenschaften und Attribute zu manipulieren:
Eigenschaften sind Teil der Objektklasse. Zum Beispiel steuert die Eigenschaft BasePart.Anchored die Physik des Teils. In einem Leichtathletikspiel möchten Sie möglicherweise einen Diskus oder einen Speer gleich nach der Landung verankern, damit die Spieler einen visuellen Hinweis darauf haben, wie weit er gereist ist.
Attribute sind im Wesentlichen benutzerdefinierte Eigenschaften, die Sie definieren. Zum Beispiel verwendet das Plant Referenzprojekt Attribute, um den Kaufpreis für Samen und die maximale Pflanzengröße, die ein Topf halten kann, festzulegen.
Replikationsreihenfolge
Bevor Sie Objekte abrufen und manipulieren, müssen Sie ein Verständnis für die Replikationsreihenfolge haben.
Die Roblox-Engine garantiert nicht die Reihenfolge, in der Objekte (und Änderungen an Objekten) vom Server zum Client repliziert werden, was die Methode Instance:WaitForChild() unverzichtbar für den Zugriff auf Objekte in Clientskripten macht, insbesondere auf Objekte im Workspace.
Wenn zum Beispiel ein Serverskript eine Eigenschaft einer Instanz im Workspace ändert und dann RemoteEvent:FireAllClients() aufruft, kann es sein, dass die Änderung der Eigenschaft zum Client repliziert wird, bevor oder nachdem RemoteEvent.OnClientEvent ausgelöst wird. Verwenden Sie die verfügbaren Methoden und Ereignisse, um Änderungen zu erkennen, anstatt anzunehmen, dass eine Änderung repliziert wurde. Änderungen desselben Typs, wie zum Beispiel zwei Attributänderungen, kommen in der Regel doch in der richtigen Reihenfolge an.
Wenn Clients ein Spiel zum ersten Mal starten, sind einige Aspekte der Replikation und Skriptausführung vorhersehbar:
Der Client lädt die Inhalte von ReplicatedFirst, wie einen Ladebildschirm, Assets und Skripte.
LocalScripts (und Scripts mit einem RunContext von Client) in ReplicatedFirst werden ausgeführt. Diese Skripte können sicher Objekte aus ReplicatedFirst abrufen, ohne Instance:WaitForChild() verwenden zu müssen:
-- Sicherlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)Diese Skripte können nicht sicher Objekte aus anderen Diensten abrufen, da diese möglicherweise noch nicht geladen sind:
-- Nicht sicherlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)Sie können WaitForChild() in diesen Skripten verwenden, um Objekte aus anderen Diensten abzurufen, aber dies negiert die Vorteile der Verwendung von ReplicatedFirst.
Der Client lädt den Rest des Spiels weiter.
Wenn er fertig ist, wird das Loaded-Ereignis ausgelöst und IsLoaded() gibt true zurück.
LocalScripts in Players.[Player].PlayerScripts (kopiert von StarterPlayerScripts) werden ausgeführt, ebenso wie Client Scripts in ReplicatedStorage. Diese Skripte können sicher Objekte aus ReplicatedStorage abrufen, ohne WaitForChild() verwenden zu müssen.
Das Charaktermodell des Spielers Character erscheint im Spiel.
LocalScripts in Workspace.[Character] (kopiert von StarterCharacterScripts) werden ausgeführt.
Wenn Ihr Spiel Instanz-Streaming (Workspace.StreamingEnabled) verwendet, könnten einige oder die meisten Objekte noch nicht in den Workspace geladen worden sein, sodass die Verwendung von WaitForChild() zum Zugriff auf Objekte im Workspace eine noch wichtigere Sicherheitsmaßnahme wird. Insbesondere siehe stream in und per-model streaming controls für weitere Informationen über das Laden und Optimieren des Streaming-Verhaltens.
Objekte abrufen
Der erste Schritt zur Modifizierung von Objekt Eigenschaften und Attributen besteht darin, eine Referenz auf das Objekt zu erhalten. Die einfachste Lösung ist, das Skript ein Kind des Objekts im Explorer zu machen und script.Parent zu verwenden, um auf das Objekt zu verweisen.

local sign = script.Parent
Die universellere Lösung besteht darin, das Objekt aus einem Dienst mithilfe von Methoden wie Instance:FindFirstChild() oder Instance:WaitForChild() abzurufen.

local ReplicatedStorage = game:GetService("ReplicatedStorage")local signsFolder = ReplicatedStorage:WaitForChild("Signs")local sign = signsFolder:WaitForChild("InteractiveSign")
Eigenschaften ändern
Eigenschaften sind einfach zuzugreifen – verwenden Sie einfach einen . nach dem Objektverweis – obwohl Sie, wenn Sie mit einem Modell arbeiten, möglicherweise ein einzelnes Teil anstelle des Modells selbst auswählen müssen.

local ReplicatedStorage = game:GetService("ReplicatedStorage")local chair = ReplicatedStorage:WaitForChild("Chair")chair.LeftArmRest.Size = Vector3.new(10, 1, 10)
Attribute erstellen
Obwohl Sie Attribute programmatisch erstellen können, ist die gebräuchlichere Lösung, sie mit Standardwerten in der Studio-Benutzeroberfläche zu erstellen. Anschließend können Sie Skripte verwenden, um ihre Werte als Reaktion auf Spieleraktionen zu ändern.

Für Informationen zum Erstellen von Attributen im Studio siehe Instanzattribute.
Attribute setzen
Um den Wert eines Attributs zu ändern, rufen Sie Instance:SetAttribute() mit einem Namen und einem Wert auf.
Attribut erstellen oder ändernlocal cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)
Wenn das Attribut noch nicht vorhanden ist, wird es mit dieser Methode erstellt.
Attributwerte abrufen
Um den Wert eines bestehenden Attributs zu erhalten, rufen Sie Instance:GetAttribute() auf der Instanz auf.
Attributwert abrufenlocal cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)local isHarvestable = cabbage:GetAttribute("Harvestable")print(isHarvestable) --> true
Ähnlich können Sie alle Attribute abrufen, indem Sie Instance:GetAttributes() aufrufen. Diese Methode gibt ein Wörterbuch von Schlüssel-Wert-Paaren zurück.
Alle Attribute abrufenlocal cabbage = script.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Attribute löschen
Um ein Attribut zu löschen, setzen Sie seinen Wert auf nil.
Attribut löschenlocal cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
Änderungen erkennen
Es gibt mehrere Möglichkeiten, um auf Änderungen an Eigenschaften und Attributen zu hören:
- Das Instance.AttributeChanged-Ereignis hört auf Änderungen an einem Attribut und übergibt den Namen des geänderten Attributs als Parameter.
- Die Methode Instance:GetPropertyChangedSignal() ermöglicht es Ihnen, auf Änderungen an einer Eigenschaft zu hören und übergibt keine Parameter.
- Die Methode Instance:GetAttributeChangedSignal() ermöglicht es Ihnen, auf Änderungen an einem Attribut zu hören und übergibt keine Parameter.
Aufgrund der minimalen Informationen, die diese Ereignisse und Methoden als Parameter übergeben, sind sie alle eine gute Wahl für anonyme Funktionen, insbesondere Instance:GetPropertyChangedSignal() und Instance:GetAttributeChangedSignal(). Um mehr über anonyme Funktionen und die Arbeit mit Ereignissen zu erfahren, siehe Ereignisse.
Auf Änderungen hören
local cabbage = script.Parent
-- Lokale Funktionen
local function onAnyPropertyChange(property)
-- Änderungen an Attributen ignorieren
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
-- Auf Änderungen hören und mit lokalen Funktionen verbinden
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Auf Änderungen hören und mit anonymen Funktionen verbinden
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Cabbage1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Löst Changed und GetPropertyChangedSignal() aus
cabbage.Name = "Cabbage1"
-- Löst Changed und AttributeChanged aus
cabbage:SetAttribute("Grow", false)
-- Löst Changed, AttributeChanged und GetAttributeChangedSignal() aus
cabbage:SetAttribute("GrowthRate", 3)