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:
Klient ładowuje zawartość ReplicatedFirst, taką jak ekran ładowania, zasoby i skrypty.
LocalScripts (i Scripts z RunContext z Client ) w ReplicatedFirst biegu.Te skrypty mogą bezpiecznie uzyskać obiekty z ReplicatedFirst bez użycia WaitForChild() :
-- Bezpiecznylocal 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:
-- Niebezpiecznelocal 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 >.
Klient nadal ładowuje resztę doświadczenia.
Gdy skończy, uruchamia się wydarzenie game.Loaded i game:IsLoaded() zwraca prawdę.
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().
Model gracza Character pojawia się w doświadczeniu.
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.

local sign = script.Parent
Bardziej uniwersalnym rozwiązaniem jest uzyskanie obiektu z usługi za pomocą metod takich jak lub .

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.

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.

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.Parentcabbage: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.Parentcabbage: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.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Usuń atrybuty
Aby usunąć atrybut, ustaw jego wartość na nil.
Usuń atrybut
local cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
Wykryj zmiany
Istnieje kilka sposobów słuchania zmian właściwości i atrybutów:
- Lista zdarzeń Instance.AttributeChanged słucha zmian w dowolnym atrybucie i przekazuje nazwę zmienionego atrybutu jako parametr.
- Metoda Instance:GetPropertyChangedSignal() pozwala słuchać zmian w jednej właściwości i nie przekazuje żadnych parametrów.
- Metoda Instance:GetAttributeChangedSignal() pozwala słuchać zmian w jednym atrybucie i nie przekazuje żadnych parametró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)