Właściwości i cechy

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

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:

  1. Klient ładowuje treści z ReplicatedFirst, takie jak ekran ładowania, zasoby i skrypty.

  2. LocalScripts (i 1> Class.Script|Scripts1> z 4> Class.Script.RunContext|RunContext4> o 7> Class.Script.RunContext7> ) w LocalScripts9> biegu. Te skrypty mogą bezpiecznie


    -- Zabezpiecz
    local 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 bezpieczny
    local 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().

  3. Kliент nadal ładowuje resztę doświadczenia.

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

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

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

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

A script parented to a model in the Explorer.

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

A Model within a Folder in ReplicatedStorage.

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.

A Model within ReplicatedStorage.

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.

A script within a folder in ReplicatedStorage.

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

Usuwanie cech

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

Usuń cech

local cabbage = script.Parent
cabbage: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)