Roblox deneyimleri varsayılan olarak çok oyunculudur, bu yüzden tüm deneyimlerin içinde, oyuncuların karakterleri hareket ettiklerinde, bazı Humanoid özellikleri, devletler gibi, sunucuya iletilir ve bu bilgileri diğer bağlantılı istemcilere iletir.
Uzaktaki etkinlikler ve çağrılar, uzaktaki klien-sunucu sınırını aşar:
- RemoteEvents bir yönlü iletişimi etkinleştirir (bir istek göndermek ve not bir yanıt için üretilmemek).
- UnreliableRemoteEvents bir veritin sürekli olarak değiştirilmesi veya oyun durumuna kritik olmayan durumlarda bir yönlü iletişimi etkinleştirir. Bu etkinliğin oluşturma ve güvenilirliği için ağ sözleşme imzalamaartırır.
- RemoteFunctions çift yönlü iletişimi (bir isteğin gönderilmesi ve alıcıdan bir yanıt alınana kadar) etkinleştirir.
Etkinleştirilebilir Etkinlikler, daha sınırlı bir kullanım alanına sahip olmalarına rağmen, uzaktaki etkinlikler ve işlevler için kullanım durumları çok fazla sayıda listelenemiyor:
- Oyun T플레이ヤーı - Temel oynanışoynama, bir oyuncu bir seviyenin sonuna ulaşması gibi, uzaktan bir etkinliğe gerekebilir. Bir klien senaryosu, sunucu, oyuncu'nun konumunu sıfırlar.
- Sunucu doğrulama - Bir oyuncu bir iksiri içmeye çalışırsa, o oyuncu aslında bu iksiri var mı? Adalet için, sunucu adil olmalıdır. Bir kliент kripti, oyuncu bir iksiri içiyor ve ardından sunucu kayıtlarını gösteren bir uzaktaki etkinliği not
- Kullanıcı arayüzünün güncellemeleri - Sunucu durumu değiştirildiğinde, sunucu kaynaklarından uzaktaki olayları kullanarak klipleri skorlar, hedefler vb. değişikliklerden haberdar edebilir.
- Uzaktan Fonksiyonları Kullanan İçindeki Pazar Yeri Satın Alımları - Bir uzaktan işlevleri kullanan örnek bir uygulama için, bakın Abonelik Satın Alımları.
Hızlı İşaret
Aşağıdaki tablolar, RemoteEvents ve RemoteFunctions arasındaki iletişimi sağlamak için hızlı bir referans olarak kullanılır.
Client → Server | >|
---|---|
Müşteri | RemoteEvent:FireServer(args) |
Sunucu | RemoteEvent.OnServerEvent:Connect(function(player, args)) |
Sunucu → Client > | >|
Sunucu | RemoteEvent:FireClient(player, args) |
Müşteri | RemoteEvent.OnClientEvent:Connect(function(args)) |
Sunucu → Tüm Müşteriler | |
Sunucu | RemoteEvent:FireAllClients(args) |
Müşteri | RemoteEvent.OnClientEvent:Connect(function(args)) |
Uzaktan Etkinlikler
Bir RemoteEvent nesnesi, yanıt olmadan client-server sınırındaki asenkron bir tuzak iletişimini kolaylaştırır.
Stüdyo'daki RemoteEvent yeni oluşturmak için Explorer penceresi aracılığıyla:
- Hover over the container into which you want to insert the RemoteEvent . In order to ensure both server and client erişim, it must be in a place where both sides can see it, such as ReplicatedStorage , although in some cases it's appropriate to store it in Workspace or inside a 1> Class.Workspace1> .
- Konteynın adının sağındaki ⊕ butonuna tıklayın ve bir Uzaktan Etkinleştirme instansı ekleyin.
- Amaçlarını açıklayan bir instansı yeniden adlandır.
Bir RemoteEvent oluşturduktan sonra, bir şekilde klienden sunucuya, sunucudan kliipe veya 1>sunucudan tüm kliplere1> iletişim kolaylığı sağlayabilir.
Client → Sunucu
Server'da bir etkinliği tetiklemek için LocalScript ı kullanarak Class.RemoteEvent:FireServer()|FireServer() yöntemini
Müşteri | RemoteEvent:FireServer(args) |
Sunucu | RemoteEvent.OnServerEvent:Connect(function(player, args)) |
Aşağıdaki Script , bir OnServerEvent oluşturur ve sunucuda yeni bir <
Etkinlik Bağlantısı - Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Uzaktaki etkinlik instansına referans alın
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onCreatePart(player, partColor, partPosition)
print(player.Name .. " fired the RemoteEvent")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = workspace
end
-- Konuşmayı etkinliğe bağla
remoteEvent.OnServerEvent:Connect(onCreatePart)
Etkinlik Başlatıcı - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Uzaktaki etkinlik instansına referans alınlocal remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")-- Uzaktaki etkinliği başlat ve ek argeleri geçremoteEvent:FireServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))
Sunucu → Client
Class.Script 를 kullanarak b
Sunucu | RemoteEvent:FireClient(player, args) |
Müşteri | RemoteEvent.OnClientEvent:Connect(function(args)) |
Aşağıdaki LocalScript , bir etkinlik eylemi işleyicine OnClientEvent etkinliğine bağlantı kurar. Ayrıca, Script ile birlikte gelen 1> Class.RemoteEvent:FireClient()|FireClient()1> , herhangi bir veriyi arzu eden o
Etkinlik Bağlantısı - Yerel Kod
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Uzaktaki etkinlik instansına referans alın
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local player = Players.LocalPlayer
local function onNotifyPlayer(maxPlayers, respawnTime)
print("[Client] Event received by player", player.Name)
print(maxPlayers, respawnTime)
end
-- Konuşmayı etkinliğe bağla
remoteEvent.OnClientEvent:Connect(onNotifyPlayer)
Etkinlik Başlatıcı - Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Uzaktaki etkinlik instansına referans alın
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Gelen oyuncuları dinleyin ve her birine uzaktan etkinlik gönderin
local function onPlayerAdded(player)
print("[Server] Firing event to player", player.Name)
remoteEvent:FireClient(player, Players.MaxPlayers, Players.RespawnTime)
end
Players.PlayerAdded:Connect(onPlayerAdded)
Sunucu → Tüm Müşteriler
Tüm müşterileri etkinleştirmek için bir Script kullanarak bir etkinliği tüm müşteriler için etkinleştirebilirsiniz
Sunucu | RemoteEvent:FireAllClients(args) |
Müşteri | RemoteEvent.OnClientEvent:Connect(function(args)) |
Aşağıdaki LocalScript , bir etkinlik olayını OnClientEvent olayına bağlar ve son sayıdown zamanını üretir. İşlemi tamamlayan Script , ardından her saniye
Etkinlik Bağlantısı - Yerel Kod
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Uzaktaki etkinlik instansına referans alın
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onTimerUpdate(seconds)
print(seconds)
end
-- Konuşmayı etkinliğe bağla
remoteEvent.OnClientEvent:Connect(onTimerUpdate)
Etkinlik Başlatıcı - Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Uzaktaki etkinlik instansına referans alınlocal remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")local countdown = 5-- Zaman sonuna kadar her saniye RemoteEvent'i başlatfor timeRemaining = -1, countdown doremoteEvent:FireAllClients(countdown - timeRemaining)task.wait(1)end
Uzaktan Çağrılar
Bir RemoteFunction nesnesi, klient-sunucu sınırı arasındaki asenkron, iki yönlü iletişimi kolaylaştırır. Bir uzaktan işlevinin göndericisi, alıcıdan bir yanıt alana kadar üretmeye devam edecektir.
Stüdyo'daki RemoteFunction yeni oluşturmak için Explorer penceresi üzerinden:
- Hover over the container into which you want to insert the RemoteFunction . In order to ensure both server and client erişim, it must be in a place where both sides can see it, such as ReplicatedStorage , although in some cases it's appropriate to store it in Workspace or inside a 1> Class.Workspace1> .
- Konteynın adının sağındaki ⊕ butonuna tıklayın ve bir Uzaktan Fonksiyon instansı ekleyin.
- Amaçlarını açıklayan bir instansı yeniden adlandır.
Bir RemoteFunction oluşturduktan sonra, klient ve sunucu veya sunucu ve klient arasındaki çift yönlü iletişimi kolaylaştırabilir.
Client → Server → Client
Class.LocalScript ın Class.RemoteFunction:ExecuteServer()|ExecuteServer() yöntemine bir Class.RemoteFunction:RemoteFunction çağırılırken
Müşteri | RemoteFunction:InvokeServer(args) |
Sunucu | RemoteFunction.OnServerInvoke = function(player, args) |
Aşağıdaki Script çağrı funksiyonunu OnServerInvoke aracılığıyla tanımlar ve istenen Part'i 2>5>Class.LocalScript5> ile birlikte çağr
Geri Çağrı Bağlantısı - Kod
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Uzaktaki Fonksiyon durumİşaret Alın
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Geri çağırma işlevi
local function createPart(player, partColor, partPosition)
print(player.Name .. " requested a new part")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = workspace
return newPart
end
-- İşlevi uzaktan işlev olarak ayarla
remoteFunction.OnServerInvoke = createPart
Etkinlik Çağrısı - YerelScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Uzaktaki Fonksiyon durumİşaret Alınlocal remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")-- Çağrıyı çağırdığınızda bir rengi ve konumunu geçerlocal newPart = remoteFunction:InvokeServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))-- Geri alınan parça referansını çıkarprint("The server created the requested part:", newPart)
Sunucu → Client → Sunucu
Bir Class.Script kullanarak, bir InvokeClient() yöntemini çağırırken bir işlevi kliyente çağırabilirsiniz, ancak aşağıdaki riskleri vardır:
- Eğer client bir hata atarsa, sunucu da hata atar.
- Eğer çağrılırken klien bağlantısını keserse, InvokeClient() bir hata oluşurur.
- Eğer istemci bir değer döndürmezse, sunucu sonsuza kadar yanıt vermez.
GUI gibi iki yönlü iletişimi gerektirmeyen eylemler için bir RemoteEvent kullanın ve sunucudan kliente ile iletişim kurun.
Argüman Sınırlaması
Bir RemoteEventı RemoteFunction çağırır veya bir Enum ile etkinleştirirseniz, bununla birlikte geçtiğiniz herhangi bir argümanı Roblox'un çağrı API'sine veya çağrı funksiyonuna aktarı
Sıralama Dışındaki İndeksiyonlar
Geçmiş bir tablinin herhangi bir indeksi olup bir Instance veya fonksiyon ise, Roblox bu indeksleri otomatik olarak 2>ip2> olarak dönüştürür.
Etkinlik Bağlantısı - Yerel Kod
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> yazı
end
end
-- Konuşmayı etkinliğe bağla
remoteEvent.OnClientEvent:Connect(onEventFire)
Etkinlik Başlatıcı - Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Gelen oyuncuları dinleyin ve her birine uzaktan etkinlik gönderin
local function onPlayerAdded(player)
remoteEvent:FireClient(player,
{
[workspace.Baseplate] = true
}
)
end
Players.PlayerAdded:Connect(onPlayerAdded)
Geçmiş Fonksiyonlar
Bir RemoteEvent veya RemoteFunction için alınan işlevler, klien-sunucu sınırında yeniden oluşturulmayacak şekilde yeniden oluşturulmayacak olacaktır, böylece işlevleri uzaktan geçmek imkansız hale getirir. Bunun yerine, alınan arg
Etkinlik Bağlantısı - Yerel Kod
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onClientEvent(func)
print(func) --> hiç
end
remoteEvent.OnClientEvent:Connect(onClientEvent)
Etkinlik Başlatıcı - Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function testFunction()
print("Hello world!")
end
-- Bir argüman olarak işlevsel bir olayı ateş
remoteEvent:FireAllClients(testFunction)
Masa İndeksi
Bir veri tablosunu geçerseniz, sayısal veya yazılım anahtarlarından oluşan karışık bir tablosu geçmeyin. Bunun yerine, tamamen bir anahtar değeri çifti (sözlük) veya aynen bir sayı indeksi geçen bir tablosunu geçin.
Etkinlik Bağlantısı - Skript
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 = Ok
--> CharName = Diva Ejderhaları
--> CharClass = Şapşal
end
end
-- Konuşmayı etkinliğe bağla
remoteEvent.OnServerEvent:Connect(onEventFire)
Etkinlik Başlatıcı - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")-- Sayısal olarak indekslenmiş tablolocal inventoryData = {"Sword", "Bow"}-- Sözlük masasılocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}remoteEvent:FireServer(inventoryData)remoteEvent:FireServer(characterData)
Masa Kimlikleri
Uzaktaki etkinlikler/çağrılara verilen tablolar argüman olarak kopyalanır, yani olayı ateşlemek veya çağrıyı çağırmak için sağlananlarla aynı olmayacaktır. Ayrıca, RemoteFunction ile çağrılan ve tabloların kimliğiyle ilgili gösterimleri göstermek için aşağıdaki kodu çalıştı
Geri Çağrı Bağlantısı - Kod
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Geri çağırma işlevi
local function returnTable(player, passedTable)
-- Çağrıda masa kimliği çıktı
print(tostring(passedTable)) --> tablo: 0x48eb7aead27563d9
return passedTable
end
-- İşlevi uzaktan işlev olarak ayarla
remoteFunction.OnServerInvoke = returnTable
Etkinlik Çağrısı - YerelScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")local inventoryData = {"Sword", "Bow"}-- Kaynağındaki tablama kimliğini gösterprint(tostring(inventoryData)) --> tablo: 0x059bcdbb2b576549local invokeReturn = remoteFunction:InvokeServer(inventoryData)-- Döndüğünde tabloya kimliği iletprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Metatabeler
Bir tabloda bir metable varsa, tüm metable bilgisi transferde kaybolur. Aşağıdaki kod örneğinde, NumWheels özelliği Car mettablolarının bir parçasıdır. Sunucu, şu tableyi aldığında,
Etkinlik Bağlantısı - Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEvent(player, param)
print(param) --> { ["İsim"] = "MyTruck")
end
-- Konuşmayı etkinliğe bağla
remoteEvent.OnServerEvent:Connect(onEvent)
Etkinlik Başlatıcı - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")local Car = {}Car.NumWheels = 4Car.__index = Carlocal truck = {}truck.Name = "MyTruck"setmetatable(truck, Car)-- Metable'i içeren tabela dahilindeki olayın oluşturulmasıremoteEvent:FireServer(truck)
Kopyalanmayan İн스턴스lar
Bir RemoteEvent veya RemoteFunction bir değeri görüntüleyen bir nil gibi bir 2>Class.RemoteEvent2> ın değerini k
Etkinlik Başlatıcı - Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Client ServerStorage'a erişemediğinden "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)
Aynı şekilde, bir LocalScript içinde bir parça oluşturursanız ve bir Script içine geçmeye çalışırsanız, sunucu nil görür çünkü parça sunucu için yeniden kullanılamaz.
Etkinlik Başlatıcı - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")-- Sunucunun bu bölümü hakkında bilgisi olmaz, bu yüzden "nil" olarak alınacaktırlocal clientPart = Instance.new("Part")clientPart.Parent = workspaceremoteEvent:FireServer(clientPart)