Czynienie doświadczeń interaktywnymi często oznacza manipulację właściwościami i atrybutami obiektu:
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 toru i pola możesz chcieć przykuć dyskus lub javelin natychmiastnie, aby gracze mieli wizualny wskaźnik tego, jak daleko się poruszył.
Atrybuty są zasadniczo niestandardowymi właściwościami, które określasz. Na przykład projekt projektu Rośliny używa atrybutów, aby ustawić cenę zakupu dla nasion i maksymalny rozmiar rośliny, który może pomieścić doniczka.
Zamówienie replikacji
Zanim rozpoczniesz odzyskiwanie i manipulowanie obiektami, musisz mieć zrozumienie rządu 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 dostępu do obiektów w skryptach klienta, w szczególności obiektów w Workspace. Niemniej niektóre aspekty procesu są przewidywalne:
Klient ładowuje treści z ReplicatedFirst, takie jak ekran ładowania, zasoby i skrypty.
LocalScripts (i 1> Class.Script|Scripts1> z 4> Class.Script.RunContext|RunContext4> o 7> Class.Script.RunContext7> ) w LocalScripts9> biegu. Te skrypty mogą bezpiecznie
-- Zabezpieczlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)Te skrypty nie mogą bezpiecznie uzyskać obiektów z innych usług, ponieważ mogą jeszcze nie być załadowane:
-- Nie bezpiecznylocal ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)Możesz używać WaitForChild() w tych skryptach, aby uzyskać obiekty z innych usług, ale robiąc to w znacznej mierze negatywne jest korzyści z używania WaitForChild().
Kliент nadal ładowuje resztę doświadczenia.
Gdy się skończy, wydarzenie game.Loaded kończy się i game:IsLoaded() zwraca prawdę.
LocalScripts w StarterPlayerScripts biegną, a także klient Scripts w 0> Class.ReplicatedStorage0> . Te skrypty mogą bezpiecznie uzyskać obiekty z 3> StarterPlayerScripts3> i LocalScripts6>, bez używania
Model gracza Character pojawia się w doświadczeniu.
LocalScripts w StarterCharacterScripts bieżącej.
Jeśli twoje doświadczenie używa przesyłania instancji ( Workspace.StreamingEnabled ) niektóre lub większość obiektów może nie zostać załadowanych do przestrzeni roboczej, więc używanie WaitForChild() do dostępu do obiektów przestrzeni roboczej st
Zdobywanie obiektów
Pierwszym krokiem do modyfikacji właściwości i cech obiektu jest uzyskanie odniesienia do obiektu.Najprostszym rozwiązaniem jest uczynienie skryptu dzieckiem obiektu w Explorer i użycie script.Parent do odniesienia się do obiektu.
local sign = script.Parent
Bardziej uniwersalnym rozwiązaniem jest uzyskanie obiektu z usługi przy użyciu metod, takich jak Instance:FindFirstChild() lub Instance:WaitForChild().
local ReplicatedStorage = game:GetService("ReplicatedStorage")local signsFolder = ReplicatedStorage:WaitForChild("Signs")local sign = signsFolder:WaitForChild("InteractiveSign")
Modyfikowanie cech
Właściwości są łatwe do dostępu — po prostu użyj . po odniesieniu odniesienia obiektu — choć jeśli pracujesz z modelem, możliwe, że będziesz musiał wybrać pojedynczą część, a nie sam model.
local ReplicatedStorage = game:GetService("ReplicatedStorage")local chair = ReplicatedStorage:WaitForChild("Chair")chair.LeftArmRest.Size = Vector3.new(10, 1, 10)
Tworzenie cech
Chociaż możesz tworzyć atrybuty programowo, najczęściej rozwiązaniem jest ich stworzenie z domyślnymi wartościami w interfejsie użytkownika Studio. Następnie możesz używać skryptów, aby zmodyfikować ich w odpowiedzi na działania gracza.
Aby uzyskać informacje na temat tworzenia atrybutów w Studio, zobacz Atrybuty Instancji.
Ustawianie cech
Aby zmienić wartość atrybutu, wezwij Instance:SetAttribute() z imieniem i wartością.
Utwórz lub zmodyfikuj atrybut
local cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)
Jeśli atrybut nie istnieje już, ten metod tworzy go.
Otrzymywanie wartości cech
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 attrybuty, nazyając Instance:GetAttributes() . Ta metoda zwraca słownik pary kluczowych.
Zdobądź wszystkie cechy
local cabbage = script.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Usuwanie cech
Aby usunąć atrybut, ustaw jego wartość na nil.
Usuń cech
local cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
Wykrywanie zmian
Są kilka sposobów na słuchanie zmian właściwości i cech:
Lista wydarzeń Instance.Changed słucha zmian w dowolnej właściwości (w tym atrybuty) i przekazuje nazwę zmienionej właściwości jako parametr.
Lista wydarzeń Instance.AttributeChanged słucha zmian dowolnego atrybutu i przekazuje nazwę zmienionego atrybutu jako parametr.
Methode Instance:GetPropertyChangedSignal() pozwala słuchać zmian w jednej właściwości i nie przekazuje parametrów.
Methode Instance:GetAttributeChangedSignal() pozwala słuchać zmian jednego atrybutu i nie przekazuje parametrów.
Ze względu na minimalną ilość informacji, które te wydarzenia i metody przesyłają jako parametry, wszystkie z nich są dobre do anonimowych funkcji, w szczególności Instance:GetPropertyChangedSignal() i Instance:GetAttributeChangedSignal(). Aby dowiedzieć się więcej o funkcjach anonimowych i działaniu z wydarzeniami, zobacz Wydarzenia.
Słuchaj zmian
local cabbage = script.Parent
-- Lokalne funkcje
local function onAnyPropertyChange(property)
-- Ignoruj zmiany atrybutów
if property ~= "Attributes" then
print(property) --> Imię
print(cabbage[property]) --> Kiszonecz1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Rośliny, Rośnię
print(cabbage:GetAttribute(attribute)) --> false, 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) --> Kiszonecz1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Zmienione pożary i GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Zmienione pożary i zmienione attrybuty
cabbage:SetAttribute("Grow", false)
-- Ognie zmienione, AttributeChanged i GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)