Eigenschaften und Attribute

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

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:

  1. Der Client lädt die Inhalte von ReplicatedFirst , wie ein Ladebildschirm, Assets und Skripte, ein.

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


    -- Sicher
    local 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 sicher
    local 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.

  3. Der Client lädt den Rest der Erlebnisweiter.

  4. Wenn es fertig ist, wird das game.Loaded-Ereignis ausgelöst und game:IsLoaded() gibt wahre zurück.

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

  6. Das Modell des Spieler:inCharacter erscheint in der Erlebnis.

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

A script parented to a model in the Explorer.

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.

A Model within a Folder in ReplicatedStorage.

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.

A Model within ReplicatedStorage.

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.

A script within a folder in ReplicatedStorage.

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.Parent
cabbage: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.Parent
cabbage: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.Parent
local cabbageAttributes = cabbage:GetAttributes()
print(cabbageAttributes.GrowthRate) --> 2
for k, v in cabbageAttributes do
print(k, v)
end

Attribute löschen

Um ein Attribut zu löschen, setze seinen Wert auf nil.

Attribut löschen

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

Änderungen erkennen

Es gibt mehrere Möglichkeiten, auf Änderungen von Eigenschaften und Attributen zu hören:

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)