Roblox oyunları varsayılan olarak çok oyunculudur, bu nedenle tüm oyunlar doğası gereği sunucu ile oyuncuların bağlı istemcileri arasında iletişim kurar. En basit durumda, oyuncular karakterlerini hareket ettirdikçe, belirli Humanoid özellikleri, durumlar gibi, sunucuya iletilir ve sunucu bu bilgiyi diğer bağlı istemcilere aktarır.
Uzaktan olaylar ve geri çağırmalar, istemci-sunucu sınırında iletişim kurmanıza olanak tanır:
- RemoteEvents tek yönlü iletişimi (bir istek gönderme ve yanıt beklememe) sağlar.
- UnreliableRemoteEvents sürekli değişen veya oyunun durumu için kritik olmayan veriler için tek yönlü iletişim sağlar. Bu olaylar, ağ performansını artırmak için sıralama ve güvenilirlikten feragat eder.
- RemoteFunctions iki yönlü iletişimi (bir istek gönderme ve alıcıdan bir yanıt alınana kadar bekleme) sağlar.
Daha sınırlı bir kullanıma sahip olan bağlanabilir olaylar ile karşılaştırıldığında, uzaktan olaylar ve fonksiyonlar için kullanım durumları saymakla bitmez:
- Oyun deneyimi - Bir oyuncunun bir seviyenin sonuna ulaşması gibi temel oyun deneyimleri bir uzaktan olaya ihtiyaç duyabilir. Bir istemci betiği sunucuya bildirimde bulunur ve sunucu betikleri oyuncunun konumunu sıfırlar.
- Sunucu doğrulaması - Bir oyuncu bir iksir içmeye çalıştığında, gerçekten o iksire sahip mi? Adalet sağlamak için, sunucu oyunun gerçek kaynağı olmalıdır. Bir istemci betiği, oyuncunun bir iksir içtiğini sunucuya bildirmek için bir uzaktan olayı kullanabilir ve ardından sunucu betikleri, oyuncunun gerçekten o iksire sahip olup olmadığını ve herhangi bir fayda verilip verilmeyeceğine karar verebilir.
- Kullanıcı arayüzü güncellemeleri - Oyun durumu değiştikçe, sunucu betikleri uzaktan olayları kullanarak istemcilere puanlar, hedefler vb. değişiklikleri bildirebilir.
- Oyun içi Pazar yerinden satın alımlar - Uzaktan fonksiyonlar kullanan bir örnek uygulama için İkna abonelik satın alımları kısmına bakın.
Hızlı referans
Aşağıdaki tablolar, RemoteEvents ve RemoteFunctions kullanarak istemci ve sunucu arasında nasıl iletişim kuracağınızı hızlı bir referans olarak hizmet eder.
| İstemci → Sunucu | |
|---|---|
| İstemci | RemoteEvent:FireServer(args) |
| Sunucu | RemoteEvent.OnServerEvent:Connect(function(player, args)) |
| Sunucu → İstemci | |
| Sunucu | RemoteEvent:FireClient(player, args) |
| İstemci | RemoteEvent.OnClientEvent:Connect(function(args)) |
| Sunucu → Tüm İstemciler | |
| Sunucu | RemoteEvent:FireAllClients(args) |
| İstemci | RemoteEvent.OnClientEvent:Connect(function(args)) |
Uzaktan olaylar
Bir RemoteEvent nesnesi, istemci-sunucu sınırında yanıt beklemeden asenkron, tek yönlü iletişimi kolaylaştırır.
Studio'daki Explorer penceresi aracılığıyla yeni bir RemoteEvent oluşturmak için:
- RemoteEvent eklemek istediğiniz konteynerin üzerine gelin. Hem sunucu hem de istemci erişimini sağlamak için, her iki tarafın da görebileceği bir yerde olmalıdır, örneğin ReplicatedStorage, ancak bazı durumlarda Workspace veya bir Tool içinde saklamak uygun olabilir.
- Konteynerin adının sağında beliren ⊕ butonuna tıklayın ve bir RemoteEvent örneği ekleyin.
- Örneği amacını tanımlayacak şekilde yeniden adlandırın.
Bir RemoteEvent oluşturduktan sonra, bu, istemciden sunucuya, sunucudan istemciye veya sunucudan tüm istemcilere tek yönlü iletişimi kolaylaştırabilir.



İstemci → sunucu
Bir LocalScript kullanarak bir sunucuda bir olayı tetiklemek için FireServer() yöntemini bir RemoteEvent üzerinde çağırabilirsiniz. FireServer() yöntemine argümanlar geçirirseniz, bunlar belirli sınırlamalar ile sunucudaki olay işleyicisine iletilir. Sunucudaki olay işleyicisinin ilk parametresi her zaman çağıran istemcinin Player nesnesidir ve ek parametreler takip eder.
| İstemci | RemoteEvent:FireServer(args) |
| Sunucu | RemoteEvent.OnServerEvent:Connect(function(player, args)) |
Aşağıdaki Script, sunucuda yeni bir Part oluşturan OnServerEvent ile bir olay işleyicisini bağlar. Eşlik eden LocalScript, ardından istenen Color ve Position ile RemoteEvent örneği üzerinde FireServer() çağrısını yapar.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
-- Uzaktan olay örneğine referans al
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onCreatePart(player, partColor, partPosition)
print(player.Name .. " uzaktan olayı tetikledi")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = Workspace
end
-- Olay ile işlevi bağla
remoteEvent.OnServerEvent:Connect(onCreatePart)local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Uzaktan olay örneğine referans al
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Uzaktan olayı tetikle ve ek argümanlar geçir
remoteEvent:FireServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))Sunucu → istemci
Bir Script kullanarak bir istemcide bir olayı tetiklemek için FireClient() yöntemini bir RemoteEvent üzerinde çağırabilirsiniz. FireClient() için ilk argüman, olaya yanıt vermek istediğiniz istemcinin Player nesnesidir ve ek argümanlar belirli sınırlamalar ile istemciye iletilir. Olay işleyicisinin ilk argümanı olarak Player nesnesini dahil etmenize gerek yoktur çünkü istemcide Players.LocalPlayer ile oyuncuyu belirleyebilirsiniz.
| Sunucu | RemoteEvent:FireClient(player, args) |
| İstemci | RemoteEvent.OnClientEvent:Connect(function(args)) |
Aşağıdaki LocalScript, OnClientEvent olayına bir olay işleyicisi bağlar. Eşlik eden Script, ardından sunucuya gelen oyuncuları dinler ve her biri için FireClient() çağrısını yapar.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Uzaktan olay örneğine referans al
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local player = Players.LocalPlayer
local function onNotifyPlayer(maxPlayers, respawnTime)
print("[İstemci] Olay oyuncuya ulaştı", player.Name)
print(maxPlayers, respawnTime)
end
-- Olay ile işlevi bağla
remoteEvent.OnClientEvent:Connect(onNotifyPlayer)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Uzaktan olay örneğine referans al
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Gelen oyuncuları dinle ve her birine uzaktan olayı tetikle
local function onPlayerAdded(player)
print("[Sunucu] Oyuncuya olayı tetikleme", player.Name)
remoteEvent:FireClient(player, Players.MaxPlayers, Players.RespawnTime)
end
Players.PlayerAdded:Connect(onPlayerAdded)Sunucu → tüm istemciler
Bir Script kullanarak tüm istemcilerde bir olayı tetiklemek için FireAllClients() yöntemini bir RemoteEvent üzerinde çağırabilirsiniz. FireClient()'in aksine, FireAllClients() yöntemi bir Player nesnesi gerektirmez çünkü RemoteEvent'i tüm istemcilere tetikler.
| Sunucu | RemoteEvent:FireAllClients(args) |
| İstemci | RemoteEvent.OnClientEvent:Connect(function(args)) |
Aşağıdaki LocalScript, kalan geri sayım süresini çıktısını veren OnClientEvent olayına bir olay işleyicisi bağlar. Eşlik eden Script, ardından her saniyede bir döngüde FireAllClients() çağrısını yaparak RemoteEvent'i tüm istemciler için tetikler.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Uzaktan olay örneğine referans al
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onTimerUpdate(seconds)
print(seconds)
end
-- Olay ile işlevi bağla
remoteEvent.OnClientEvent:Connect(onTimerUpdate)local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Uzaktan olay örneğine referans al
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local countdown = 5
-- Süre dolana kadar her saniye uzaktan olayı tetikle
for timeRemaining = -1, countdown do
remoteEvent:FireAllClients(countdown - timeRemaining)
task.wait(1)
endUzaktan geri çağırmalar
Bir RemoteFunction nesnesi, istemci-sunucu sınırında senkron, iki yönlü iletişimi kolaylaştırır. Bir uzaktan fonksiyonun göndericisi, alıcıdan bir yanıt alana kadar bekler.
Studio'daki Explorer penceresi aracılığıyla yeni bir RemoteFunction oluşturmak için:
- RemoteFunction eklemek istediğiniz konteynerin üzerine gelin. Hem sunucu hem de istemci erişimini sağlamak için, her iki tarafın da görebileceği bir yerde olmalıdır, örneğin ReplicatedStorage, ancak bazı durumlarda Workspace veya bir Tool içinde saklamak uygun olabilir.
- Konteynerin adının sağında beliren ⊕ butonuna tıklayın ve bir RemoteFunction örneği ekleyin.
- Örneği amacını tanımlayacak şekilde yeniden adlandırın.
Bir RemoteFunction oluşturduktan sonra, bu, istemci ve sunucu veya sunucu ve istemci arasında iki yönlü iletişimi kolaylaştırabilir.


İstemci → sunucu → istemci
Bir LocalScript kullanarak bir sunucuda bir fonksiyonu çağırmak için InvokeServer() yöntemini bir RemoteFunction üzerinde çağırabilirsiniz. Bir uzaktan olay ile karşılaştırıldığında, RemoteFunction'u çağıran LocalScript, geri çağırma döndüğünde bekler. InvokeServer() yöntemine geçirdiğiniz argümanlar, OnServerInvoke geri çağırmasına belirli sınırlamalar ile iletilir. Bir RemoteFunction için birden fazla geri çağırma tanımlarsanız, yalnızca son tanım çalışır.
| İstemci | RemoteFunction:InvokeServer(args) |
| Sunucu | RemoteFunction.OnServerInvoke = function(player, args) |
Aşağıdaki Script, OnServerInvoke aracılığıyla geri çağırma işlevini tanımlar ve istenen Part'ı return değeri aracılığıyla döndürür. Eşlik eden LocalScript, ardından istenen parça rengi ve konumunu tanımlayan ek argümanlarla InvokeServer() çağrısını yapar.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
-- Uzaktan fonksiyon örneğine referans al
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Geri çağırma işlevi
local function createPart(player, partColor, partPosition)
print(player.Name .. " yeni bir parça talep etti")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = Workspace
return newPart
end
-- Fonksiyonu uzaktan fonksiyonun geri çağırması olarak ayarla
remoteFunction.OnServerInvoke = createPartlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Uzaktan fonksiyon örneğine referans al
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Geri çağırmayı tetiklerken bir renk ve konum geçir
local newPart = remoteFunction:InvokeServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))
-- Döndürülen parça referansını çıktısını al
print("Sunucu talep edilen parçayı oluşturdu:", newPart)Sunucu → istemci → sunucu
Bir Script kullanarak istemcide bir fonksiyonu çağırmak için InvokeClient() yöntemini bir RemoteFunction üzerinde çağırabilirsiniz, ancak bunun ciddi riskleri vardır:
- Eğer istemci bir hata fırlatırsa, sunucu da hatayı fırlatır.
- İstemci çağrılırken bağlantısını keserse, InvokeClient() bir hata fırlatır.
- İstemci bir değer döndürmezse, sunucu sonsuza kadar bekler.
İki yönlü iletişim gerektirmeyen işlemler için, örneğin bir GUI'yi güncellemek gibi, bir RemoteEvent kullanın ve sunucudan istemciye iletişim kurun.
Teslimat garantileri
Her uzaktan tür, bir mesajın varışını ve hangi sırayla geldiği konusunda farklı vaatlerde bulunur. Bu vaatler yalnızca tek bir bağlantı için ve tek bir yönde geçerlidir; yani sunucudan belirli bir istemciye veya belirli bir istemciden sunucuya.
RemoteEvents
RemoteEvents güvenilir ve sıralıdır:
- Eğer bir mesaj iletim sırasında kaybolursa, Roblox onu alıcı bağlı kaldığı sürece yeniden iletir.
- Mesajlar, gönderdiğiniz sırayla gelir, farklı RemoteEvent örnekleri arasında bile. Örneğin, sunucu önce A olayını, sonra B olayını, ardından aynı istemciye tekrar A olayını tetiklerse, o istemci A, B, A alır. Bu, FireClient() veya FireAllClients() kullanıp kullanmadığınıza bakılmaksızın geçerlidir.
- Eğer bir istemci, kısıtlama limitinden daha hızlı olaylar tetiklerse, sunucu fazladan olayları atmak yerine daha sonra işler ve sıralarını korurlar.
Güvenilir, sıralı bir mesaj, aşağıdaki durumlarda kodunuza ulaşamayabilir:
- Hiçbir işleyici bağlı değil. Eğer OnServerEvent veya OnClientEvent'e bir şey bağlı değilse, Roblox mesajı kuyruklar ve bir işleyici bağlandığında, sırayla teslim eder. Kuyruk, hem sayıda hem de bellekle sınırlıdır. Dolu olduğunda, Roblox daha fazla mesajı atar ve Çıktı penceresine Remote event invocation hatası kaydeder.
- Alıcı bağlantısını keserse. Bir istemci ayrıldığında teslim edilmemiş mesajlar kaybolur.
Sıralama, her işleyicinin başladığı zamana uygulanır, bitişine değil. Eğer bir işleyici beklerse, örneğin task.wait() veya WaitForChild() çağrısı yaparsa, Roblox önceki işleyici yeniden devam etmeden önce bir sonraki mesajı işlemeye başlayabilir.
RemoteFunctions
RemoteFunctions çağrıları ve yanıtları güvenilir bir şekilde gönderir, bu nedenle Roblox kaybolan mesajları yeniden iletir, her iki taraf da bağlı kaldığı sürece. InvokeServer() ve InvokeClient() yanıt gelene kadar beklediğinden, tek bir iş parçacığı aynı anda birden fazla çağrı yapamaz. Ancak ayrı iş parçacıkları aynı anda çağrı yapabilir ve bir geri çağırma beklerse, yanıtlar gönderilen çağrılardan farklı bir sırayla geri gelebilir.
Eğer OnServerInvoke veya OnClientInvoke için hiçbir geri çağırma atanmazsa, Roblox çağrıları bir tane atanana kadar kuyruklar. Bu kuyruk, RemoteEvent kuyruklarıyla aynı türden sınırlara sahiptir.
UnreliableRemoteEvents
UnreliableRemoteEvents ne teslimat ne de sıralama garantisi verir. Ayrıca RemoteEvents veya RemoteFunctions ile hiçbir sıralama ilişkisi yoktur. Roblox, aşağıdaki durumların herhangi birinde bir mesajı atlayabilir, yeniden göndermeden:
- Mesaj iletim sırasında kaybolur.
- Ağ tıkanıklığı vardır ve mesaj gönderilmek için çok uzun süre bekler.
- Yük 1.000 bayttan büyüktür.
- İstemci, kısıtlama limitinden daha hızlı tetikler. RemoteEvent'in aksine, sunucu fazladan mesajları atar, geciktirmez.
- Mesaj geldiğinde OnServerEvent veya OnClientEvent'e hiçbir şey bağlı değilse. RemoteEvent'in aksine, Roblox mesajı hemen atar, kuyruklamaz.
Roblox ayrıca, daha sonraki bir mesajı işlemeye başlamadan önce önceki bir mesajın gelmesini beklemez, bu nedenle mesajlar sıralı olarak gelebilir. Eğer sıralama önemliyse, her mesaja bir zaman damgası veya sıra numarası ekleyin ve işlediğiniz en son mesaja göre daha eski mesajları göz ardı edin.
Kısıtlama ve boyut limitleri
İstemciden sunucuya mesajlar, her uzaktan türün tüm örnekleri arasında paylaşılan bir hız limitine tabidir. Mevcut limitler için RemoteEvent'in Kısıtlama bölümüne ve UnreliableRemoteEvent'deki yük limitlerine bakın.
Argüman sınırlamaları
Bir RemoteEvent tetiklediğinizde veya bir RemoteFunction çağırdığınızda, olayla veya geri çağırma işlevine geçirdiğiniz argümanları iletir. Herhangi bir tür Roblox nesnesi, örneğin bir Enum, Instance veya diğerleri geçilebilir, ayrıca sayılar, dizeler ve boolean gibi Luau türleri de geçilebilir, ancak aşağıdaki sınırlamaları dikkatlice incelemelisiniz.
Dize olmayan indeksler
Geçirilen bir tablonun herhangi bir indeksi dize olmayan türler, örneğin bir Instance, userdata veya fonksiyon gibi ise, Roblox bu indeksleri otomatik olarak dizelere dönüştürür.
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
-- Olay ile işlevi bağla
remoteEvent.OnClientEvent:Connect(onEventFire)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Gelen oyuncuları dinle ve her birine uzaktan olayı tetikle
local function onPlayerAdded(player)
remoteEvent:FireClient(player,
{
[Workspace.Baseplate] = true
}
)
end
Players.PlayerAdded:Connect(onPlayerAdded)Geçirilen fonksiyonlar
Bir RemoteEvent veya RemoteFunction için argüman olarak dahil edilen fonksiyonlar, istemci-sunucu sınırında çoğaltılmaz, bu nedenle uzaktan fonksiyonları geçmek imkansızdır. Bunun yerine, alıcı tarafındaki sonuç argümanı nil olur.
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("Merhaba dünya!")
end
-- Fonksiyonu argüman olarak geçirerek uzaktan olayı tetikle
remoteEvent:FireAllClients(testFunction)Tablo dizinleme
Bir veri tablosu geçiriyorsanız, karışık bir tablo (sayısal ve dize anahtarları) geçirmeyin. Bunun yerine, yalnızca anahtar-değer çiftlerinden (sözlük) veya yalnızca sayısal dizinlerden oluşan bir tablo geçirin.
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 = Kılıç
--> 2 = Yay
--> CharName = Diva Dragonslayer
--> CharClass = Rogue
end
end
-- Olay ile işlevi bağla
remoteEvent.OnServerEvent:Connect(onEventFire)local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Sayısal dizinli tablo
local inventoryData = {
"Kılıç", "Yay"
}
-- Sözlük tablosu
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
remoteEvent:FireServer(inventoryData)
remoteEvent:FireServer(characterData)Tablo kimlikleri
Uzaktan olaylara/geri çağırmalara argüman olarak geçirilen tablolar kopyalanır, yani tetikleme olayında veya geri çağırmada sağlananlarla tam olarak eşit olmayacaklardır. Ayrıca, geri çağırmaya döndürülen tablolar da sağlananlarla tam olarak eşit olmayacaktır. Bunu, aşağıdaki RemoteFunction üzerinde çalıştırarak ve tablo kimliklerinin nasıl farklı olduğunu gözlemleyerek gösterebilirsiniz.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Geri çağırma işlevi
local function returnTable(player, passedTable)
-- Çağrıldığında tablo kimliğini çıktısını al
print(tostring(passedTable)) --> table: 0x48eb7aead27563d9
return passedTable
end
-- Fonksiyonu uzaktan fonksiyonun geri çağırması olarak ayarla
remoteFunction.OnServerInvoke = returnTablelocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
local inventoryData = {
"Kılıç", "Yay"
}
-- Orijinal tablo kimliğini çıktısını al
print(tostring(inventoryData)) --> table: 0x059bcdbb2b576549
local invokeReturn = remoteFunction:InvokeServer(inventoryData)
-- Döndürülen tablo kimliğini çıktısını al
print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9Metatable'ler
Bir tablonun bir metatable'ı varsa, transfer sırasında tüm metatable bilgileri kaybolur. Aşağıdaki kod örneğinde, NumWheels özelliği Car metatable'ının bir parçasıdır. Sunucu aşağıdaki tabloyu aldığında, truck tablosu Name özelliğine sahip ancak NumWheels özelliğine sahip değildir.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEvent(player, param)
print(param) --> {["Name"] = "MyTruck"}
end
-- Olay ile işlevi bağla
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 = "MyTruck"
setmetatable(truck, Car)
-- Metatable içeren tablo ile olayı tetikle
remoteEvent:FireServer(truck)Kopyalanamayan örnekler
Eğer bir RemoteEvent veya RemoteFunction, yalnızca göndericiye görünür bir değeri geçirirse, Roblox bunu istemci-sunucu sınırında çoğaltmaz ve bunun yerine nil değerini geçirir. Örneğin, bir Script bir ServerStorage alt nesnesini geçirirse, olayı dinleyen istemci nil değeri alır çünkü bu nesne istemci için çoğaltılamaz.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Sunucu depolama alanına erişemediği için "nil" olarak alınacak
local storedPart = Instance.new("Part")
storedPart.Parent = ServerStorage
local function onPlayerAdded(player)
remoteEvent:FireClient(player, storedPart)
end
Players.PlayerAdded:Connect(onPlayerAdded)Benzer şekilde, bir LocalScript içinde bir parça oluşturursanız ve bunu bir Script'e geçirmeye çalışırsanız, sunucu nil görecektir çünkü parça sunucu için çoğaltılamaz.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Workspace = game:GetService("Workspace")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Sunucu bu parçayı bilmediği için "nil" olarak alınacak
local clientPart = Instance.new("Part")
clientPart.Parent = Workspace
remoteEvent:FireServer(clientPart)