Właściwości i atuty

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Sprawianie, że doświadczenia są interaktywne, często oznacza manipulowanie właściwościami i atributami obiektów:

  • Właściwości są częścią klasy obiektu.Na przykład, właściwość BasePart.Anchored kontroluje fizykę dla części.W doświadczeniu na torze i polu możesz chcieć zakotwiczyć dysk lub oszczep w momencie, gdy wyląduje, aby gracze mieli wizualny wskaźnik tego, jak daleko podróżowali.

  • Atrybuty są zasadniczo niestandardowymi właściwościami, które określasz.Na przykład projekt referencyjny Roślinka używa atrybutów, aby ustawić cenę zakupu nasion i maksymalną wielkość rośliny, jaką może utrzymać doniczka.

Zamówienie replikacji

Zanim zaczniesz odzyskiwać i manipulować obiektami, musisz zrozumieć kolejność replikacji.

Silnik Roblox nie gwarantuje kolejności, w której obiekty są replikowane z serwera na klienta, co czyni metodę Instance:WaitForChild() niezbędną do uzyskiwania dostępu do obiektów w skryptach klienta, w szczególności obiektów w Workspace.Nadal jednak niektóre aspekty procesu są przewidywalne:

  1. Klient ładowuje zawartość ReplicatedFirst, taką jak ekran ładowania, zasoby i skrypty.

  2. LocalScripts (i Scripts z RunContext z Client ) w ReplicatedFirst biegu.Te skrypty mogą bezpiecznie uzyskać obiekty z ReplicatedFirst bez użycia WaitForChild() :


    -- Bezpieczny
    local ReplicatedFirst = game:GetService("ReplicatedFirst")
    local LoadingScreen = require(ReplicatedFirst.LoadingScreen)

    Te skrypty nie mogą bezpiecznie uzyskać obiekty z innych usług , ponieważ mogą jeszcze nie być załadowane:


    -- Niebezpieczne
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local PickupManager = require(ReplicatedStorage.PickupManager)

    Możesz używać tego w tych skryptach, aby uzyskać obiekty z innych usług, ale to anuluje korzyści z używania >.

  3. Klient nadal ładowuje resztę doświadczenia.

  4. Gdy skończy, uruchamia się wydarzenie game.Loaded i game:IsLoaded() zwraca prawdę.

  5. LocalScripts w Players.Player.PlayerScripts (skopiowane z StarterPlayerScripts ) uruchomienie, a także klient Scripts w ReplicatedStorage .Te skrypty mogą bezpiecznie uzyskiwać obiekty z ReplicatedStorage bez użycia WaitForChild().

  6. Model gracza Character pojawia się w doświadczeniu.

  7. LocalScripts w Workspace.Character (skopiowane z StarterCharacterScripts) uruchomienie.

Jeśli twoje doświadczenie korzysta z przesyłania instancji ( Workspace.StreamingEnabled ), niektóre lub większość obiektów mogły nie zostać załadowane do przestrzeni roboczej, więc użycie WaitForChild() do uzyskiwania obiektów przestrzeni roboczej staje się jeszcze ważniejszym środkiem bezpieczeństwa.W szczególności, patrz Strumień w i sterowanie przepływem per modelu na dodatkowe informacje o ładowaniu i dostosowywaniu zachowania przepływu.

Zdobądź obiekty

Pierwszym krokiem do modyfikacji właściwości i atributów obiektu jest uzyskanie odniesienia do obiektu.Najprostszym rozwiązaniem jest uczynienie skryptu dzieckiem obiektu w Explorerze i użycie script.Parent do odwołania się do obiektu.

A script parented to a model in the Explorer.

local sign = script.Parent

Bardziej uniwersalnym rozwiązaniem jest uzyskanie obiektu z usługi za pomocą metod takich jak lub .

A Model within a Folder in ReplicatedStorage.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local signsFolder = ReplicatedStorage:WaitForChild("Signs")
local sign = signsFolder:WaitForChild("InteractiveSign")

Modyfikuj właściwości

Właściwości są łatwe do uzyskania - po prostu użyj . po odniesieniu do obiektu - choć jeśli pracujesz z modelem, możesz potrzebować wybrać pojedynczą część zamiast samego modelu.

A Model within ReplicatedStorage.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local chair = ReplicatedStorage:WaitForChild("Chair")
chair.LeftArmRest.Size = Vector3.new(10, 1, 10)

Twórz atrybuty

Chociaż możesz tworzyć atrybuty programowo, rozwiązaniem najbardziej powszechnym jest tworzenie ich z domyślnymi wartościami w interfejsie użytkownika Studio.Następnie możesz używać skryptów, aby modyfikować ich wartości w odpowiedzi na działania gracza.

A script within a folder in ReplicatedStorage.

Aby uzyskać informacje o tworzeniu atrybutów w Studio, zobacz atrybuty instancji.

Ustaw atrybuty

Aby zmienić wartość atrybutu, wezwij Instance:SetAttribute() z nazwą i wartością.

Twórz lub modyfikuj atrybut

local cabbage = script.Parent
cabbage:SetAttribute("Harvestable", true)

Jeśli atrybut nie istnieje już, metoda ta go tworzy.

Zdobądź wartości atrybutów

Aby uzyskać wartość jednego istniejącego atrybutu, wezwij Instance:GetAttribute() na instancja.

Zdobądź wartość atrybutu

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

Podobnie możesz uzyskać wszystkie atrybuty, wywołując Instance:GetAttributes(). Ta metoda zwraca słownik pary klucz-wartość.

Zdobądź wszystkie atrybuty

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

Usuń atrybuty

Aby usunąć atrybut, ustaw jego wartość na nil.

Usuń atrybut

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

Wykryj zmiany

Istnieje kilka sposobów słuchania zmian właściwości i atrybutów:

Ze względu na minimalną ilość informacji, jakie przekazują te wydarzenia i metody jako parametry, wszystkie są dobrym dopasowaniem do funkcji anonimowych, w szczególności Instance:GetPropertyChangedSignal() i Instance:GetAttributeChangedSignal().Aby dowiedzieć się więcej o anonimowych funkcjach i pracy z wydarzeniami, zobacz Wydarzenia.

Słuchaj zmian

local cabbage = script.Parent
-- Funkcje lokalne
local function onAnyPropertyChange(property)
-- Ignoruj zmiany w atrybutach
if property ~= "Attributes" then
print(property) --> Nazwa
print(cabbage[property]) --> Kiełek1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Rozwój, Stopa wzrostu
print(cabbage:GetAttribute(attribute)) --> fałsz, 3
end
-- Słuchaj zmian i łącz się z lokalnymi funkcjami
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Słuchaj zmian i łącz się z anonimowymi funkcjami
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Kiełek1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Zmiany ogniów i sygnał GetPropertyChanged()
cabbage.Name = "Cabbage1"
-- Zmiany ogniów i zmiana atrybutu
cabbage:SetAttribute("Grow", false)
-- Zmienione pożary, zmieniono atrybut i otrzymano sygnał zmiany atrybutu GetAttributeChanged()
cabbage:SetAttribute("GrowthRate", 3)