Uzaktan Etkinlikler ve Çağrılar

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

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üşteriRemoteEvent:FireServer(args)
SunucuRemoteEvent.OnServerEvent:Connect(function(player, args))
Sunucu → Client >
SunucuRemoteEvent:FireClient(player, args)
MüşteriRemoteEvent.OnClientEvent:Connect(function(args))
Sunucu → Tüm Müşteriler
SunucuRemoteEvent:FireAllClients(args)
MüşteriRemoteEvent.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:

  1. 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> .
  2. Konteynın adının sağındaki butonuna tıklayın ve bir Uzaktan Etkinleştirme instansı ekleyin.
  3. 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
Sunucu → Klient
Sunucu → Tüm Müşteriler

Client → Sunucu

Server'da bir etkinliği tetiklemek için LocalScript ı kullanarak Class.RemoteEvent:FireServer()|FireServer() yöntemini

MüşteriRemoteEvent:FireServer(args)
SunucuRemoteEvent.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ın
local 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

SunucuRemoteEvent:FireClient(player, args)
MüşteriRemoteEvent.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

SunucuRemoteEvent:FireAllClients(args)
MüşteriRemoteEvent.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ın
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local countdown = 5
-- Zaman sonuna kadar her saniye RemoteEvent'i başlat
for timeRemaining = -1, countdown do
remoteEvent: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:

  1. 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> .
  2. Konteynın adının sağındaki butonuna tıklayın ve bir Uzaktan Fonksiyon instansı ekleyin.
  3. 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 → Sunucu → Client
Sunucu → Client → Sunucu

Client → Server → Client

Class.LocalScript ın Class.RemoteFunction:ExecuteServer()|ExecuteServer() yöntemine bir Class.RemoteFunction:RemoteFunction çağırılırken

MüşteriRemoteFunction:InvokeServer(args)
SunucuRemoteFunction.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ın
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Çağrıyı çağırdığınızda bir rengi ve konumunu geçer
local newPart = remoteFunction:InvokeServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))
-- Geri alınan parça referansını çıkar
print("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ş tablo
local 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öster
print(tostring(inventoryData)) --> tablo: 0x059bcdbb2b576549
local invokeReturn = remoteFunction:InvokeServer(inventoryData)
-- Döndüğünde tabloya kimliği ilet
print(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 = 4
Car.__index = Car
local 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ır
local clientPart = Instance.new("Part")
clientPart.Parent = workspace
remoteEvent:FireServer(clientPart)