Gry Roblox są domyślnie wieloosobowe, więc wszystkie gry z natury komunikują się między serwerem a podłączonymi klientami graczy. W najprostszym przypadku, gdy gracze poruszają swoimi postaciami, pewne właściwości Humanoid, takie jak stany, są komunikowane do serwera, który przekazuje te informacje do innych podłączonych klientów.
Zdalne zdarzenia i wywołania zwrotne pozwalają na komunikację przez granicę klient-serwer:
- RemoteEvents umożliwiają komunikację jednokierunkową (wysyłanie żądania i nie oczekiwanie na odpowiedź).
- UnreliableRemoteEvents umożliwiają komunikację jednokierunkową dla danych, które zmieniają się ciągle lub nie są krytyczne dla stanu gry. Te zdarzenia wymieniają porządek i niezawodność na poprawę wydajności sieci.
- RemoteFunctions umożliwiają komunikację dwukierunkową (wysyłanie żądania i oczekiwanie na odpowiedź od odbiorcy).
W przeciwieństwie do zdarzeń wiążących, które mają bardziej ograniczone zastosowanie, przypadków użycia dla zdalnych zdarzeń i funkcji jest zbyt wiele, aby je wymienić:
- Rozgrywka - Podstawowa rozgrywka, taka jak gracz osiągający koniec poziomu, może wymagać zdalnego zdarzenia. Skrypt klienta powiadamia serwer, a skrypty serwera resetują pozycję gracza.
- Weryfikacja serwera - Jeśli gracz próbuje wypić miksturę, czy naprawdę ma tę miksturę? Aby zapewnić uczciwość, serwer musi być źródłem prawdy dla gry. Skrypt klienta może użyć zdalnego zdarzenia, aby powiadomić serwer, że gracz pije miksturę, a następnie skrypty serwera mogą zdecydować, czy gracz rzeczywiście ma tę miksturę i czy przyznać jakiekolwiek korzyści.
- Aktualizacje interfejsu użytkownika - W miarę zmiany stanu gry, skrypty serwera mogą używać zdalnych zdarzeń, aby powiadomić klientów o zmianach w wynikach, celach itp.
- Zakupy na rynku w grze - Aby zobaczyć przykład implementacji, która używa zdalnych funkcji, zobacz Zakupy subskrypcyjne.
Szybki przewodnik
Poniższe tabele służą jako szybki przewodnik po tym, jak używać RemoteEvents i RemoteFunctions do komunikacji między klientem a serwerem.
| Klient → Serwer | |
|---|---|
| Klient | RemoteEvent:FireServer(args) |
| Serwer | RemoteEvent.OnServerEvent:Connect(function(player, args)) |
| Serwer → Klient | |
| Serwer | RemoteEvent:FireClient(player, args) |
| Klient | RemoteEvent.OnClientEvent:Connect(function(args)) |
| Serwer → Wszyscy Klienci | |
| Serwer | RemoteEvent:FireAllClients(args) |
| Klient | RemoteEvent.OnClientEvent:Connect(function(args)) |
Zdalne zdarzenia
Obiekt RemoteEvent ułatwia asynchroniczną, jednokierunkową komunikację przez granicę klient-serwer bez oczekiwania na odpowiedź.
Aby utworzyć nowe RemoteEvent za pomocą okna Eksploratora w Studio:
- Najedź na kontener, do którego chcesz wstawić RemoteEvent. Aby zapewnić dostęp zarówno serwera, jak i klienta, musi znajdować się w miejscu, w którym obie strony mogą go zobaczyć, takim jak ReplicatedStorage, chociaż w niektórych przypadkach odpowiednie jest przechowywanie go w Workspace lub wewnątrz Tool.
- Kliknij przycisk ⊕, który pojawia się po prawej stronie nazwy kontenera i wstaw instancję RemoteEvent.
- Zmień nazwę instancji, aby opisać jej cel.
Gdy już utworzysz RemoteEvent, może on ułatwić jednokierunkową komunikację z klienta do serwera, z serwera do klienta lub z serwera do wszystkich klientów.



Klient → serwer
Możesz użyć LocalScript, aby wywołać zdarzenie na serwerze, wywołując metodę FireServer() na RemoteEvent. Jeśli przekażesz argumenty do FireServer(), zostaną one przekazane do obsługi zdarzenia na serwerze z pewnymi ograniczeniami. Zauważ, że pierwszy parametr obsługi zdarzenia na serwerze to zawsze obiekt Player klienta, który go wywołuje, a dodatkowe parametry następują po nim.
| Klient | RemoteEvent:FireServer(args) |
| Serwer | RemoteEvent.OnServerEvent:Connect(function(player, args)) |
Poniższy Script łączy funkcję obsługi zdarzenia z OnServerEvent, która tworzy nowy Part na serwerze. Towarzyszący LocalScript następnie wywołuje FireServer() na instancji RemoteEvent z pożądanym Color i Position dla części.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
-- Uzyskaj odniesienie do instancji zdalnego zdarzenia
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onCreatePart(player, partColor, partPosition)
print(player.Name .. " wywołał RemoteEvent")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = Workspace
end
-- Połącz funkcję z zdarzeniem
remoteEvent.OnServerEvent:Connect(onCreatePart)local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Uzyskaj odniesienie do instancji zdalnego zdarzenia
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Wywołaj zdalne zdarzenie i przekaż dodatkowe argumenty
remoteEvent:FireServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))Serwer → klient
Możesz użyć Script, aby wywołać zdarzenie na kliencie, wywołując metodę FireClient() na RemoteEvent. Pierwszym argumentem dla FireClient() jest obiekt Player klienta, który ma odpowiedzieć na zdarzenie, a dodatkowe argumenty są przekazywane do klienta z pewnymi ograniczeniami. Zauważ, że obsługa zdarzenia nie musi zawierać obiektu Player jako pierwszego argumentu, ponieważ możesz określić gracza na kliencie za pomocą Players.LocalPlayer.
| Serwer | RemoteEvent:FireClient(player, args) |
| Klient | RemoteEvent.OnClientEvent:Connect(function(args)) |
Poniższy LocalScript łączy funkcję obsługi zdarzenia z OnClientEvent. Towarzyszący Script następnie nasłuchuje na przychodzących graczy do serwera i wywołuje FireClient() dla każdego z nich z dowolnymi danymi.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Uzyskaj odniesienie do instancji zdalnego zdarzenia
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local player = Players.LocalPlayer
local function onNotifyPlayer(maxPlayers, respawnTime)
print("[Klient] Zdarzenie odebrane przez gracza", player.Name)
print(maxPlayers, respawnTime)
end
-- Połącz funkcję z zdarzeniem
remoteEvent.OnClientEvent:Connect(onNotifyPlayer)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Uzyskaj odniesienie do instancji zdalnego zdarzenia
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Nasłuchuj na przychodzących graczy i wywołuj zdalne zdarzenie dla każdego
local function onPlayerAdded(player)
print("[Serwer] Wywołanie zdarzenia dla gracza", player.Name)
remoteEvent:FireClient(player, Players.MaxPlayers, Players.RespawnTime)
end
Players.PlayerAdded:Connect(onPlayerAdded)Serwer → wszyscy klienci
Możesz użyć Script, aby wywołać zdarzenie dla wszystkich klientów, wywołując metodę FireAllClients() na RemoteEvent. W przeciwieństwie do FireClient(), metoda FireAllClients() nie wymaga obiektu Player, ponieważ wywołuje RemoteEvent do wszystkich klientów.
| Serwer | RemoteEvent:FireAllClients(args) |
| Klient | RemoteEvent.OnClientEvent:Connect(function(args)) |
Poniższy LocalScript łączy funkcję obsługi zdarzenia z OnClientEvent, która wyświetla pozostały czas odliczania. Towarzyszący Script następnie wywołuje FireAllClients() w pętli co sekundę, aby wywołać RemoteEvent dla wszystkich klientów.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Uzyskaj odniesienie do instancji zdalnego zdarzenia
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onTimerUpdate(seconds)
print(seconds)
end
-- Połącz funkcję z zdarzeniem
remoteEvent.OnClientEvent:Connect(onTimerUpdate)local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Uzyskaj odniesienie do instancji zdalnego zdarzenia
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local countdown = 5
-- Wywołuj RemoteEvent co sekundę, aż czas wygaśnie
for timeRemaining = -1, countdown do
remoteEvent:FireAllClients(countdown - timeRemaining)
task.wait(1)
endZdalne wywołania zwrotne
Obiekt RemoteFunction ułatwia synchroniczną, dwukierunkową komunikację przez granicę klient-serwer. Nadawca zdalnej funkcji będzie czekał, aż otrzyma odpowiedź od odbiorcy.
Aby utworzyć nową RemoteFunction za pomocą okna Eksploratora w Studio:
- Najedź na kontener, do którego chcesz wstawić RemoteFunction. Aby zapewnić dostęp zarówno serwera, jak i klienta, musi znajdować się w miejscu, w którym obie strony mogą go zobaczyć, takim jak ReplicatedStorage, chociaż w niektórych przypadkach odpowiednie jest przechowywanie go w Workspace lub wewnątrz Tool.
- Kliknij przycisk ⊕, który pojawia się po prawej stronie nazwy kontenera i wstaw instancję RemoteFunction.
- Zmień nazwę instancji, aby opisać jej cel.
Gdy już utworzysz RemoteFunction, może on ułatwić dwukierunkową komunikację między klientem a serwerem lub między serwerem a klientem.


Klient → serwer → klient
Możesz użyć LocalScript, aby wywołać funkcję na serwerze, wywołując metodę InvokeServer() na RemoteFunction. W przeciwieństwie do zdalnego zdarzenia, LocalScript, który wywołuje RemoteFunction, czeka, aż wywołanie zwrotne zwróci. Argumenty, które przekażesz do InvokeServer(), są przekazywane do wywołania zwrotnego OnServerInvoke z RemoteFunction z pewnymi ograniczeniami. Zauważ, że jeśli zdefiniujesz wiele wywołań zwrotnych dla tej samej RemoteFunction, tylko ostatnia definicja zostanie wykonana.
| Klient | RemoteFunction:InvokeServer(args) |
| Serwer | RemoteFunction.OnServerInvoke = function(player, args) |
Poniższy Script definiuje funkcję wywołania zwrotnego za pomocą OnServerInvoke i zwraca żądany Part przez wartość return. Towarzyszący LocalScript następnie wywołuje InvokeServer() z dodatkowymi argumentami definiującymi żądaną kolorystykę i pozycję części.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
-- Uzyskaj odniesienie do instancji zdalnej funkcji
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Funkcja wywołania zwrotnego
local function createPart(player, partColor, partPosition)
print(player.Name .. " zażądał nowej części")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = Workspace
return newPart
end
-- Ustaw funkcję jako wywołanie zwrotne zdalnej funkcji
remoteFunction.OnServerInvoke = createPartlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Uzyskaj odniesienie do instancji zdalnej funkcji
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Przekaż kolor i pozycję podczas wywoływania wywołania zwrotnego
local newPart = remoteFunction:InvokeServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))
-- Wyświetl odniesienie do zwróconej części
print("Serwer utworzył żądaną część:", newPart)Serwer → klient → serwer
Możesz użyć Script, aby wywołać funkcję na kliencie, wywołując metodę InvokeClient() na RemoteFunction, ale wiąże się to z poważnymi ryzykami, takimi jak:
- Jeśli klient zgłosi błąd, serwer również zgłosi błąd.
- Jeśli klient rozłączy się podczas wywołania, InvokeClient() zgłosi błąd.
- Jeśli klient nie zwróci wartości, serwer będzie czekał w nieskończoność.
W przypadku działań, które nie wymagają komunikacji dwukierunkowej, takich jak aktualizacja GUI, użyj RemoteEvent i komunikuj się z serwera do klienta.
Gwarancje dostawy
Każdy typ zdalny składa różne obietnice dotyczące tego, czy wiadomość dociera i w jakiej kolejności. Te obietnice dotyczą tylko pojedynczego połączenia w jednym kierunku, co oznacza z serwera do jednego konkretnego klienta lub z jednego konkretnego klienta do serwera.
RemoteEvents
RemoteEvents są niezawodne i uporządkowane:
- Jeśli wiadomość zostanie utracona w trakcie przesyłania, Roblox retransmituje ją, aż dotrze, pod warunkiem, że odbiorca pozostaje podłączony.
- Wiadomości docierają w kolejności, w jakiej je wysyłasz, w tym przez różne instancje RemoteEvent. Na przykład, jeśli serwer wywołuje zdarzenie A, następnie B, a potem A ponownie do tego samego klienta, ten klient otrzymuje A, B, A. Dotyczy to zarówno FireClient(), jak i FireAllClients().
- Jeśli klient wywołuje zdarzenia szybciej niż limit ograniczeń, serwer przetwarza nadmiarowe zdarzenia później, zamiast je odrzucać, a one zachowują swoją kolejność.
Niezawodna, uporządkowana wiadomość może nadal nie dotrzeć do twojego kodu w następujących przypadkach:
- Brak połączenia. Jeśli nic nie jest podłączone do OnServerEvent lub OnClientEvent, gdy wiadomość dociera, Roblox kolejkowuje ją i dostarcza, w kolejności, gdy tylko połączenie zostanie nawiązane. Kolejka jest ograniczona zarówno pod względem liczby, jak i pamięci. Gdy jest pełna, Roblox odrzuca dalsze wiadomości i rejestruje błąd Remote event invocation w oknie Wyjścia.
- Odbiorca się rozłącza. Wiadomości, które nie zostały dostarczone, gdy klient opuszcza, są tracone.
Porządek dotyczy momentu, w którym każde połączenie zaczyna, a nie kiedy kończy. Jeśli połączenie czeka, na przykład wywołując task.wait() lub WaitForChild(), Roblox może rozpocząć przetwarzanie następnej wiadomości przed wznowieniem wcześniejszego połączenia.
RemoteFunctions
RemoteFunctions wysyłają wywołania i odpowiedzi niezawodnie, więc Roblox retransmituje utracone wiadomości, pod warunkiem, że obie strony pozostają podłączone. Ponieważ InvokeServer() i InvokeClient() czekają na odpowiedź, pojedynczy wątek nie może mieć więcej niż jednego wywołania w trakcie. Oddzielne wątki mogą wywoływać jednocześnie, a jeśli wywołanie zwrotne czeka, odpowiedzi mogą wracać w innej kolejności niż wysłane wywołania.
Jeśli żadne wywołanie zwrotne nie jest przypisane do OnServerInvoke lub OnClientInvoke, Roblox kolejkowuje wywołania, aż jedno zostanie przypisane. Ta kolejka ma te same ograniczenia, co kolejka RemoteEvent.
UnreliableRemoteEvents
UnreliableRemoteEvents nie gwarantują ani dostawy, ani kolejności. Nie mają również żadnej relacji porządkowej z RemoteEvents lub RemoteFunctions. Roblox może odrzucić wiadomość w dowolnym z następujących przypadków, bez jej ponownego wysyłania:
- Wiadomość została utracona w trakcie przesyłania.
- Sieć jest przeciążona, a wiadomość czeka zbyt długo na wysłanie.
- Ładunek jest większy niż 1000 bajtów.
- Klient wywołuje szybciej niż limit ograniczeń. W przeciwieństwie do RemoteEvent, serwer odrzuca nadmiarowe wiadomości, zamiast ich opóźniać.
- Nic nie jest podłączone do OnServerEvent lub OnClientEvent, gdy wiadomość dociera. W przeciwieństwie do RemoteEvent, Roblox natychmiast odrzuca wiadomość, zamiast jej kolejkować.
Roblox nie czeka również na dotarcie wcześniejszej wiadomości przed przetworzeniem późniejszej, więc wiadomości mogą docierać w innej kolejności. Jeśli kolejność ma znaczenie, dołącz znacznik czasu lub numer sekwencyjny do każdej wiadomości i ignoruj wiadomości starsze niż najnowsza, którą obsłużyłeś.
Ograniczenia dotyczące throttlingu i rozmiaru
Wiadomości z klienta do serwera podlegają limitowi szybkości, który każdy typ zdalny dzieli między wszystkie swoje instancje. Aby uzyskać aktualne limity, zobacz sekcję Throttling w RemoteEvent oraz limity ładunku w UnreliableRemoteEvent.
Ograniczenia argumentów
Gdy wywołujesz RemoteEvent lub wywołujesz RemoteFunction, przekazuje on wszelkie argumenty, które przekażesz z zdarzeniem lub do funkcji wywołania zwrotnego. Można przekazywać dowolny typ obiektu Roblox, taki jak Enum, Instance lub inne, a także typy Luau, takie jak liczby, ciągi i wartości logiczne, chociaż powinieneś dokładnie zbadać następujące ograniczenia.
Indeksy niebędące ciągami
Jeśli jakiekolwiek indeksy przekazanej tabeli są typami niebędącymi ciągami, takimi jak Instance, userdata lub funkcja, Roblox automatycznie konwertuje te indeksy na ciągi.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> string
end
end
-- Połącz funkcję z zdarzeniem
remoteEvent.OnClientEvent:Connect(onEventFire)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Nasłuchuj na przychodzących graczy i wywołuj zdalne zdarzenie dla każdego
local function onPlayerAdded(player)
remoteEvent:FireClient(player,
{
[Workspace.Baseplate] = true
}
)
end
Players.PlayerAdded:Connect(onPlayerAdded)Przekazywane funkcje
Funkcje zawarte jako argumenty dla RemoteEvent lub RemoteFunction nie będą replikowane przez granicę klient-serwer, co uniemożliwia zdalne przekazywanie funkcji. Zamiast tego wynikowy argument po stronie odbierającej będzie nil.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onClientEvent(func)
print(func) --> nil
end
remoteEvent.OnClientEvent:Connect(onClientEvent)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function testFunction()
print("Witaj świecie!")
end
-- Wywołaj zdalne zdarzenie z funkcją jako argumentem
remoteEvent:FireAllClients(testFunction)Indeksowanie tabel
Jeśli przekazujesz tabelę danych, nie przekazuj mieszanej tabeli z kluczami numerycznymi i ciągowymi. Zamiast tego przekaż tabelę, która składa się wyłącznie z par klucz-wartość (słownik) lub wyłącznie z indeksów numerycznych.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEventFire(player, passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = Miecz
--> 2 = Łuk
--> CharName = Diva Dragonslayer
--> CharClass = Złodziej
end
end
-- Połącz funkcję z zdarzeniem
remoteEvent.OnServerEvent:Connect(onEventFire)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Tabela z indeksami numerycznymi
local inventoryData = {
"Miecz", "Łuk"
}
-- Tabela słownikowa
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Złodziej"
}
remoteEvent:FireServer(inventoryData)
remoteEvent:FireServer(characterData)Tożsamości tabel
Tabele przekazywane jako argumenty do zdalnych zdarzeń/wywołań zwrotnych są kopiowane, co oznacza, że nie będą dokładnie równoważne tym, które zostały podane podczas wywoływania zdarzenia lub wywoływania wywołania zwrotnego. Tabele zwracane do wywołującego również nie będą dokładnie równoważne tym, które zostały podane. Możesz to wykazać, uruchamiając następujący skrypt na RemoteFunction i obserwując, jak różnią się tożsamości tabel.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Funkcja wywołania zwrotnego
local function returnTable(player, passedTable)
-- Wyświetl tożsamość tabeli podczas wywołania
print(tostring(passedTable)) --> table: 0x48eb7aead27563d9
return passedTable
end
-- Ustaw funkcję jako wywołanie zwrotne zdalnej funkcji
remoteFunction.OnServerInvoke = returnTablelocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
local inventoryData = {
"Miecz", "Łuk"
}
-- Wyświetl oryginalną tożsamość tabeli
print(tostring(inventoryData)) --> table: 0x059bcdbb2b576549
local invokeReturn = remoteFunction:InvokeServer(inventoryData)
-- Wyświetl tożsamość tabeli po zwrocie
print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9Metatabele
Jeśli tabela ma metatable, wszystkie informacje o metatable są tracone podczas transferu. W poniższym przykładzie kodu właściwość NumWheels jest częścią metatable Car. Gdy serwer otrzymuje poniższą tabelę, tabela truck ma właściwość Name, ale nie ma właściwości NumWheels.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEvent(player, param)
print(param) --> {["Name"] = "MójTruck"}
end
-- Połącz funkcję z zdarzeniem
remoteEvent.OnServerEvent:Connect(onEvent)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local Car = {}
Car.NumWheels = 4
Car.__index = Car
local truck = {}
truck.Name = "MójTruck"
setmetatable(truck, Car)
-- Wywołaj zdarzenie z tabelą zawierającą metatable
remoteEvent:FireServer(truck)Instancje, które nie są replikowane
Jeśli RemoteEvent lub RemoteFunction przekazuje wartość, która jest widoczna tylko dla nadawcy, Roblox nie replikuje jej przez granicę klient-serwer i zamiast tego przekazuje nil zamiast wartości. Na przykład, jeśli Script przekazuje potomka ServerStorage, klient nasłuchujący zdarzenia otrzyma wartość nil, ponieważ ten obiekt nie jest replikowalny dla klienta.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Zostanie odebrane jako "nil", ponieważ klient nie ma dostępu do ServerStorage
local storedPart = Instance.new("Part")
storedPart.Parent = ServerStorage
local function onPlayerAdded(player)
remoteEvent:FireClient(player, storedPart)
end
Players.PlayerAdded:Connect(onPlayerAdded)Podobnie, jeśli utworzysz część w LocalScript i spróbujesz przekazać ją do Script, serwer zobaczy nil, ponieważ część nie jest replikowalna dla serwera.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Zostanie odebrane jako "nil", ponieważ serwer nie wie o tej części
local clientPart = Instance.new("Part")
clientPart.Parent = Workspace
remoteEvent:FireServer(clientPart)