Pengalaman Roblox secara default bermain multiplayer, jadi semua pengalaman secara inherently berkomunikasi antara server dan klien yang terhubung. Dalam kasus paling sederhana, saat pemain pindah karakter mereka, beberapa Humanoid属性, seperti Humanoid, dikomunikasikan ke server, yang kemudian menyampaikan informasi ini ke klien yang terhubung lainnya.
Acara dan panggilan jarak memungkinkan Anda berkomunikasi melalui batas antara klien dan server:
- RemoteEvents mengaktifkan komunikasi satu arah (mengirim permintaan dan tidak menghasilkan untuk respons).
- UnreliableRemoteEvents mengaktifkan komunikasi satu arah untuk data yang berubah secara terus-menerus atau bukan kritis untuk game state. Acara ini berdagang perdagangan dan kelincahan untuk meningkatkan pelaksanaanjaringan.
- RemoteFunctions mengaktifkan komunikasi dua arah (mengirim permintaan dan menghasilkan sampai respons diterima dari penerima).
Terlepas dari Acara yang Dapat Dibindakan, yang memiliki lebih sedikit utilitas, kasus penggunaan untuk acara dan fungsi jarak terlalu banyak untuk dicantum:
- Gameplay - gameplaydasar, seperti seorang pemain mencapai akhir level, dapat mengharuskan acara remote. Skrip klien mengirimkan server, dan server skrip mengatur posisi pemain.
- Verifikasi server - Jika seorang pemain mencoba minum ramuan, apakah mereka benar-benar memiliki ramuan itu? Untuk menjamin keadilan, server harus menjadi sumber kebenaran untuk pengalaman. Skrip klien dapat menggunakan acara remote untuk mengirimkan pada server bahwa pemain memang memiliki ramuan itu dan kemudian server script dapat memutus
- Pembaruan antarmuka pengguna - Ketika status permainan berubah, server script dapat menggunakan acara jarak untuk memberi tahu klien tentang perubahan skor, tujuan, dll.
- Pembelian Pasar dalam Pengalaman - Untuk contoh implementasi yang menggunakan fungsi remote, lihat Mendesak Pembelian Langganan.
Referensi Cepat
Tabel berikut ini menyajikan referensi cepat tentang cara menggunakan RemoteEvents dan RemoteFunctions untuk berkomunikasi antara klien dan server.
Klien → Server ” | ”|
---|---|
Klien | RemoteEvent:FireServer(args) |
Server | RemoteEvent.OnServerEvent:Connect(function(player, args)) |
Server | RemoteEvent:FireClient(player, args) |
Klien | RemoteEvent.OnClientEvent:Connect(function(args)) |
Server | RemoteEvent:FireAllClients(args) |
Klien | RemoteEvent.OnClientEvent:Connect(function(args)) |
Acara Jarak Jauh
Sebuah objek RemoteEvent memudahkan komunikasi asinkronis, satu arah di antara batas klien-server tanpa menghasilkan tanggapan.
Untuk membuat <a href="/reference/engine/datastores">Class.RemoteEvent</a> baru melalui jendela <a href="/explorer">Class.RemoteEvent</a> di Studio:
- Hover over the container into which you want to insert the RemoteEvent . In order to ensure both server and client akses, 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.RemoteEvent1> .
- Klik tombol ⊕ yang muncul di sebelah nama kontainer dan masukkan instans RemoteEvent .
- Ganti nama instansi untuk menjelaskan tujuan.
Setelah Anda telah menciptakan RemoteEvent, itu dapat memudahkan komunikasi satu arah dari klien ke server, dari server ke klien, atau dari 2>server ke semua klien2>.
Klien → Server
Anda dapat menggunakan a LocalScript untuk menetapkan acara di server dengan menelepon metode Class.RemoteEvent:FireServer()|FireServer() di
Klien | RemoteEvent:FireServer(args) |
Server | RemoteEvent.OnServerEvent:Connect(function(player, args)) |
Berikut Script terhubung dengan acara pengelola ke OnServerEvent yang menciptakan <
Koneksi Acara - Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Dapatkan referensi ke instansi acara kejadian
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
-- Tautkan fungsi ke acara
remoteEvent.OnServerEvent:Connect(onCreatePart)
Acara Pengaktifan - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Dapatkan referensi ke instansi acara kejadianlocal remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")-- Fire the remote event dan pass argument tambahanremoteEvent:FireServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))
Server → Klien
Anda dapat menggunakan a Class.Script
Server | RemoteEvent:FireClient(player, args) |
Klien | RemoteEvent.OnClientEvent:Connect(function(args)) |
Berikut LocalScript terhubung dengan acara OnClientEvent . Aksesori Script kemudian mendengarkan pemain yang datang ke server dan memanggil 1> Class.RemoteEvent:FireClient()|FireClient()1> untuk setiap dengan data apa pun.
Koneksi Acara - Skrip Lokal
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Dapatkan referensi ke instansi acara kejadian
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
-- Tautkan fungsi ke acara
remoteEvent.OnClientEvent:Connect(onNotifyPlayer)
Peluncuran Acara - Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Dapatkan referensi ke instansi acara kejadian
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Dengarkan pemain yang masuk dan sampaikan acara remote ke masing-masing
local function onPlayerAdded(player)
print("[Server] Firing event to player", player.Name)
remoteEvent:FireClient(player, Players.MaxPlayers, Players.RespawnTime)
end
Players.PlayerAdded:Connect(onPlayerAdded)
Server → Semua Klien
Anda dapat menggunakan a Script untuk menyebabkan acara pada semua klien dengan menyebut metode Class.RemoteEvent:FireAllClients()|FireAllCl
Server | RemoteEvent:FireAllClients(args) |
Klien | RemoteEvent.OnClientEvent:Connect(function(args)) |
Berikut adalah LocalScript menghubungkan pengelola acara ke acara OnClientEvent yang menghasilkan waktu hitung mundur yang tersisa. The accompanying Script then calls 2>Class.RemoteEvent:FireAllClients()|FireAllClients()
Koneksi Acara - Skrip Lokal
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Dapatkan referensi ke instansi acara kejadian
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onTimerUpdate(seconds)
print(seconds)
end
-- Tautkan fungsi ke acara
remoteEvent.OnClientEvent:Connect(onTimerUpdate)
Peluncuran Acara - Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Dapatkan referensi ke instansi acara kejadianlocal remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")local countdown = 5-- Jadwalkan Acara Remote setiap detik sampai waktu habisfor timeRemaining = -1, countdown doremoteEvent:FireAllClients(countdown - timeRemaining)task.wait(1)end
Panggilan Remote
Sebuah objek RemoteFunction memudahkan komunikasi antar-server secara sinkronis, dua arah, di antara batas klien-server. Pengirim fungsi jarak akan menghasilkan sampai menerima respons dari penerima.
Untuk membuat <a href="/scripting/events/reference/engine/datatable">Class.RemoteFunction</a> baru melalui jendela <a href="https://studio.explorerapi.eu/explorer-窗口" target="_blank">Explorer</a> di Studio:
- Hover over the container into which you want to insert the RemoteFunction . In order to ensure both server and client akses, 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.RemoteFunction1> .
- Klik tombol ⊕ yang muncul di sebelah nama kontainer dan masukkan instans RemoteFunction .
- Ganti nama instansi untuk menjelaskan tujuan.
Setelah Anda telah menciptakan RemoteFunction, itu dapat memudahkan komunikasi dua arah antara klien dan server atau antara server dan klien .
Klien → Server → Klien
Anda dapat menggunakan a Class.LocalScript untuk memanggil fungsi di server dengan menyebut metode 0> Class.RemoteFunction:ExecuteServer
Klien | RemoteFunction:InvokeServer(args) |
Server | RemoteFunction.OnServerInvoke = function(player, args) |
Berikut adalah definisi fungsi panggilan melalui Script dan mengembalikan permintaan OnServerInvoke melalui nilai Part nya. 2> Class.LocalScript2> kemudian memanggil 5>
Panggilan Koneksi - Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Dapatkan referensi ke kejadianfungsi remote
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Fungsi panggilan
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
-- Tetapkan fungsi sebagai panggilan fungsi jarak
remoteFunction.OnServerInvoke = createPart
Pengundangan Acara - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Dapatkan referensi ke kejadianfungsi remotelocal remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")-- Melewati warna dan posisi saat memanggil kembalilocal newPart = remoteFunction:InvokeServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))-- Output referensi bagian yang dikembalikanprint("The server created the requested part:", newPart)
Server → Klien → Server
Anda dapat menggunakan a Script untuk memanggil fungsi di klien dengan menyebut metode InvokeClient() di RemoteFunction, tetapi memiliki risiko serius sebagai berikut:
- Jika klien menghasilkan kesalahan, server menghasilkan kesalahan juga.
- Jika klien terputus saat diaktifkan, InvokeClient() menghasilkan kesalahan.
- Jika klien tidak mengembalikan nilai, server menghasilkan selamanya.
Untuk tindakan yang tidak memerlukan komunikasi dua arah, seperti menyetel ulang GUI, gunakan RemoteEvent dan berkomunikasi dari server ke klien .
Limitasi Argument
Ketika Anda mengekspor RemoteEvent atau mengundang RemoteFunction , itu akan menyampaikan semua argumen yang Anda berikan dengan acara atau ke fungsi panggilan. Setiap jenis objek Roblox seperti Enum , 2>Class.Instance</
Indeks Tidak Struktur
Jika ada indeks dari tabel yang dilewati menjadi jenis non-string seperti Instance , userdata , atau 1>fungsi1> , Roblox secara otomatis mengubah jenis indeks ini menjadi string.
Koneksi Acara - Skrip Lokal
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
-- Tautkan fungsi ke acara
remoteEvent.OnClientEvent:Connect(onEventFire)
Peluncuran Acara - Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Dengarkan pemain yang masuk dan sampaikan acara remote ke masing-masing
local function onPlayerAdded(player)
remoteEvent:FireClient(player,
{
[workspace.Baseplate] = true
}
)
end
Players.PlayerAdded:Connect(onPlayerAdded)
Fungsi yang Dilewati
Fungsi yang termasuk sebagai argumen untuk RemoteEvent atau RemoteFunction akan tidak dapat diklon di seluruh batas 1>klien-server1>, menyebabkan tidak mungkin untuk mengirim fungsi secara jarak. Sebaliknya, argumen yang dihasilkan di sisi penerima akan menjadi
Koneksi Acara - Skrip Lokal
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onClientEvent(func)
print(func) --> nol
end
remoteEvent.OnClientEvent:Connect(onClientEvent)
Peluncuran Acara - Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function testFunction()
print("Hello world!")
end
-- Acara remote fire dengan fungsi sebagai argumen
remoteEvent:FireAllClients(testFunction)
Indeks Tabel
Jika Anda melewati tabel data, jangan melewati tabel campuran angka dan kunci numerik. Sebaliknya, melewati tabel yang terdiri dari sepenuhnya pasangan kunci-值 (d典藏) atau sepenuhnya indeks numerik.
Koneksi Acara - Skrip
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 = Pedang
--> 2 = Panah
--> CharName = Pembunuh Naga Diva
--> CharClass = Rogue
end
end
-- Tautkan fungsi ke acara
remoteEvent.OnServerEvent:Connect(onEventFire)
Acara Pengaktifan - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")-- Tabel yang diindeks secara numeriklocal inventoryData = {"Sword", "Bow"}-- Tabel Kamuslocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}remoteEvent:FireServer(inventoryData)remoteEvent:FireServer(characterData)
Identitas Meja
Tabel dilewati sebagai argumen ke acara/CALLBACK yang jauh jadi mereka tidak akan persis sama dengan yang diberikan ketika mengeksekusi acara atau menyebutkan Callback. Tabel yang dikembalikan ke invoker tidak akan persis sama dengan yang diberikan. Anda dapat menunjukkan ini dengan mengeksekuskan skrip berikut di RemoteFunction dan mengamati perbedaan identitas tabel.
Panggilan Koneksi - Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Fungsi panggilan
local function returnTable(player, passedTable)
-- Output tabel identitas pada panggilan
print(tostring(passedTable)) --> tabel: 0x48eb7aead27563d9
return passedTable
end
-- Tetapkan fungsi sebagai panggilan fungsi jarak
remoteFunction.OnServerInvoke = returnTable
Pengundangan Acara - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")local inventoryData = {"Sword", "Bow"}-- Output identitas tabel asliprint(tostring(inventoryData)) --> tabel: 0x059bcdbb2b576549local invokeReturn = remoteFunction:InvokeServer(inventoryData)-- Output tabel identitas saat kembaliprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Metabel
Jika tabel memiliki metabel, semua informasi metabel dihilangkan dalam transfer. Dalam contoh kode berikut, properti NumWheels adalah bagian dari metabel Car. Saat server menerima tabel berikut, tabel truck memiliki properti 1> Name</
Koneksi Acara - Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEvent(player, param)
print(param) --> { ["Name"] = "MyTruck")
end
-- Tautkan fungsi ke acara
remoteEvent.OnServerEvent:Connect(onEvent)
Acara Pengaktifan - 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)-- Acara api dengan tabel termasuk tabel metabelremoteEvent:FireServer(truck)
Instans Tidak Replikasi
Jika RemoteEvent atau RemoteFunction menghasilkan nilai yang hanya dapat dilihat oleh pengirim, Roblox tidak mengkloningnya di antara batas klien-server dan mengir
Peluncuran Acara - Skrip
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Akan diterima sebagai "nil" karena klien tidak dapat mengakses ServerStorage
local storedPart = Instance.new("Part")
storedPart.Parent = ServerStorage
local function onPlayerAdded(player)
remoteEvent:FireClient(player, storedPart)
end
Players.PlayerAdded:Connect(onPlayerAdded)
Demikian pula, jika Anda membuat bagian di LocalScript dan mencoba untuk menghubungkannya ke Script, server akan melihat nil karena bagian tidak dapat diklon untuk server.
Acara Pengaktifan - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")-- Akan diterima sebagai "nil" karena server tidak tahu tentang bagian inilocal clientPart = Instance.new("Part")clientPart.Parent = workspaceremoteEvent:FireServer(clientPart)