Erlebnisse interaktiv zu machen, bedeutet oft, Objekt-Eigenschaften und Attribute zu manipulieren:
Eigenschaften sind Teil der Objektklasse.Zum Beispiel steuert die Eigenschaft BasePart.Anchored die Physik für das Teil.In einem Track-and-Field-Erlebnis möchten Sie vielleicht einen Diskus oder einen Speer sofort verankern, sobald er landet, damit die Spieler einen visuellen Indikator haben, wie weit er gereist ist.
Attribute sind im Wesentlichen benutzerdefinierte Eigenschaften, die du definierst.Zum Beispiel verwendet das Pflanzen-Referenzprojekt Attribute, um den Kaufpreis für Samen und die maximale Pflanzgröße festzulegen, die ein Topf enthalten kann.
Replikationsordnung
Bevor du beginnst, Objekte abzurufen und zu manipulieren, musst du ein Verständnis der Replikations顺序 haben.
Die Roblox-Engine garantiert nicht die Reihenfolge, in der Objekte vom Server zum Client repliziert werden, was die Instance:WaitForChild()-Methode für den Zugriff auf Objekte in Client-Skripts unerlässlich macht, insbesondere Objekte im Workspace.Dennoch sind einige Aspekte des Prozesses vorhersehbar:
Der Client lädt die Inhalte von ReplicatedFirst , wie ein Ladebildschirm, Assets und Skripte, ein.
LocalScripts (und Scripts mit einem RunContext von Client ) in ReplicatedFirst ausführen.Diese Skripte können sicher Objekte von ReplicatedFirst ohne Verwendung von WaitForChild() erhalten:
-- Sicherlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)Diese Skripte können nicht sicher Objekte von anderen Diensten erhalten, weil sie möglicherweise noch nicht geladen wurden:
-- Nicht sicherlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)Du kannst in diesen Skripten WaitForChild() verwenden, um Objekte von anderen Diensten zu erhalten, aber dadurch werden die Vorteile der Verwendung von ReplicatedFirst negiert.
Der Client lädt den Rest der Erlebnisweiter.
Wenn es fertig ist, wird das game.Loaded-Ereignis ausgelöst und game:IsLoaded() gibt wahre zurück.
LocalScripts in Players.Player.PlayerScripts (kopiert von StarterPlayerScripts ) ausführen, sowie Client Scripts in ReplicatedStorage .Diese Skripte können sicher Objekte von ReplicatedStorage ohne Verwendung von WaitForChild() erhalten.
Das Modell des Spieler:inCharacter erscheint in der Erlebnis.
LocalScripts in Workspace.Character (kopiert von StarterCharacterScripts ) ausführen.
Wenn deine Erfahrung Instanzstreaming verwendet ( Workspace.StreamingEnabled ), könnten einige oder die meisten Objekte nicht in den Arbeitsbereich geladen worden sein, so dass die Verwendung von WaitForChild() zum Zugriff auf Arbeitsbereichsobjekte zu einer noch wichtigeren Sicherheitsmaßnahme wird.Insbesondere siehe Stream in und Per-Modell-Streaming-Steuerelemente für zusätzliche Informationen zur Lädtung und Anpassung des Streamverhaltens.
Objekte erhalten
Der erste Schritt zum Ändern von Objekt-Eigenschaften und -Attributen besteht darin, eine Referenz zum Objekt zu erhalten.Die einfachste Lösung besteht darin, das Skript zu einem 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 von einem Service mit Methoden wie Instance:FindFirstChild() oder Instance:WaitForChild() zu erhalten.

local ReplicatedStorage = game:GetService("ReplicatedStorage")local signsFolder = ReplicatedStorage:WaitForChild("Signs")local sign = signsFolder:WaitForChild("InteractiveSign")
Eigenschaften modifizieren
Eigenschaften sind einfach zugänglich — verwende einfach ein . nach der Objekt referenz — obwohl, wenn du mit einem Modell arbeitest, musst du möglicherweise ein einzelnes Teil wählen, anstatt das Modell selbst.

local ReplicatedStorage = game:GetService("ReplicatedStorage")local chair = ReplicatedStorage:WaitForChild("Chair")chair.LeftArmRest.Size = Vector3.new(10, 1, 10)
Attributen erstellen
Obwohl du Attribute programmatisch erstellen kannst, ist die häufigere Lösung, sie mit Standardwerten im Studio-Benutzeroberfläche zu erstellen.Dann kannst du Skripte verwenden, um ihre Werte im Zusammenhang mit den Aktionen des Spielers zu ändern.

Für Informationen zum Erstellen von Attributen in Studio sehen Sie Instanzattributen.
Attributen festlegen
Um den Wert eines Attributs zu modifizieren, rufe Instance:SetAttribute() mit einem Namen und einem Wert auf.
Attribut erstellen oder modifizieren
local cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)
Wenn das Attribut noch nicht existiert, erstellt diese Methode es.
Attributwerte erhalten
Um den Wert eines bestehenden Attributes zu erhalten, rufe Instance:GetAttribute() auf der Instanz auf.
Attributwert abrufen
local cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)local isHarvestable = cabbage:GetAttribute("Harvestable")print(isHarvestable) --> true
Ähnlich kannst du alle Attribute erhalten, indem du Instance:GetAttributes() anrufst. Diese Methode gibt ein Wörterbuch von Schlüssel-Wert-Paaren zurück.
Alle Attribute erhalten
local 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, setze seinen Wert auf nil.
Attribut löschen
local cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
Änderungen erkennen
Es gibt mehrere Möglichkeiten, auf Änderungen von Eigenschaften und Attributen zu hören:
- Die Instance.AttributeChanged Event-Liste hört auf Änderungen an jedem Attribut und überträgt den Namen des geänderten Attributes als Parameter.
- Die Methode Instance:GetPropertyChangedSignal() lässt dich auf Änderungen an einer Eigenschaft hören und überlässt keine Parameter.
- Die Methode Instance:GetAttributeChangedSignal() lässt dich auf Änderungen an einem Attribut hören und überlässt keine Parameter.
Aufgrund der minimalen Informationen, die diese Ereignisse und Methoden als Parameter übermitteln, 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.
Ä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]) --> Kohl1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Wachsen, Wachstumsrate
print(cabbage:GetAttribute(attribute)) --> falsch, 3
end
-- Ä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) --> Kohl1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Feuer geändert und GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Feuer geändert und Attribut geändert
cabbage:SetAttribute("Grow", false)
-- Feuer geändert, Attribute geändert und GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)