Acara dan Panggilan Jarak Jauh

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

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.

Server → Klien ”

Server → Semua Klien ”

Klien → Server
KlienRemoteEvent:FireServer(args)
ServerRemoteEvent.OnServerEvent:Connect(function(player, args))
ServerRemoteEvent:FireClient(player, args)
KlienRemoteEvent.OnClientEvent:Connect(function(args))
ServerRemoteEvent:FireAllClients(args)
KlienRemoteEvent.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:

  1. 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> .
  2. Klik tombol yang muncul di sebelah nama kontainer dan masukkan instans RemoteEvent .
  3. 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
Server → Klien
Server → Semua Klien

Klien → Server

Anda dapat menggunakan a LocalScript untuk menetapkan acara di server dengan menelepon metode Class.RemoteEvent:FireServer()|FireServer() di

KlienRemoteEvent:FireServer(args)
ServerRemoteEvent.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 kejadian
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Fire the remote event dan pass argument tambahan
remoteEvent:FireServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))

Server → Klien

Anda dapat menggunakan a Class.Script

ServerRemoteEvent:FireClient(player, args)
KlienRemoteEvent.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

ServerRemoteEvent:FireAllClients(args)
KlienRemoteEvent.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 kejadian
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local countdown = 5
-- Jadwalkan Acara Remote setiap detik sampai waktu habis
for timeRemaining = -1, countdown do
remoteEvent: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:

  1. 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> .
  2. Klik tombol yang muncul di sebelah nama kontainer dan masukkan instans RemoteFunction .
  3. 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
Server → Klien → Server

Klien → Server → Klien

Anda dapat menggunakan a Class.LocalScript untuk memanggil fungsi di server dengan menyebut metode 0> Class.RemoteFunction:ExecuteServer

KlienRemoteFunction:InvokeServer(args)
ServerRemoteFunction.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 remote
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Melewati warna dan posisi saat memanggil kembali
local newPart = remoteFunction:InvokeServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))
-- Output referensi bagian yang dikembalikan
print("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 numerik
local inventoryData = {
"Sword", "Bow"
}
-- Tabel Kamus
local 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 asli
print(tostring(inventoryData)) --> tabel: 0x059bcdbb2b576549
local invokeReturn = remoteFunction:InvokeServer(inventoryData)
-- Output tabel identitas saat kembali
print(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 = 4
Car.__index = Car
local truck = {}
truck.Name = "MyTruck"
setmetatable(truck, Car)
-- Acara api dengan tabel termasuk tabel metabel
remoteEvent: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 ini
local clientPart = Instance.new("Part")
clientPart.Parent = workspace
remoteEvent:FireServer(clientPart)