Trải nghiệm Roblox là multiplayer bởi mặc định, vì vậy tất cả các trải nghiệm đều được giao tiếp giữa máy chủ và các khách hàng kết nối. Trong trường hợp đơn giản nhất, khi người chơi di chuyển nhân vật của họ, một số Humanoid属性
Các sự kiện và hành tây tại chỗ cho phép bạn truyền thông trao đổi giữa client-server boundary:
- RemoteEvents kích hoạt truyền thông hướng tới (gửi một yêu cầu và không phản lại cho một phản hồi).
- UnreliableRemoteEvents kích hoạt truyền thông hướng tung cho dữ liệu thay đổi liên tục hoặc không quan trọng cho trạng thái trò chơi. Những sự kiện này trao đổi truyền thông và độ tin cậy cho hiệu hiệu lựcmạng cải thiện.
- RemoteFunctions kích hoạt trò chuyện hai chiều (gửi một yêu cầu và trả lại cho đến khi nhận được một câu trả lời từ người nhận).
Ngoài ra, Sự kiểm tra dính dịu hơn , which có sử dụng hạn chế hơn, các trường hợp sử dụng cho các sự kiểm tra và chức năng từ xa quá nhiều để đề cập:
- Gameplay - trải nghiệm trò chơicơ bản, chẳng hạn như một người chơi đến cuối cấp độ, có thể yêu cầu một sự kiệnRemote. Một script client thông báo cho máy chủ, và script máy chủ thiết lập vị trí của người chơi.
- Xác minh máy chủ - Nếu một người chơi thử uống một lọ thuốc, họ có thực sự có lọ thuốc đó không? Để đảm bảo công bằng, máy chủ phải là nguồn sự thật cho một trải nghiệm. Một tập lệnh khách hàng có thể sử
- Cập nhật giao diện người dùng - Khi trạng thái trò chơi thay đổi, các tập lệnh máy chủ có thể sử dụng sự kiện truyền hình để thông báo cho khách hàng về các thay đổi điểm, mục tiêu, v.v.
- Mua trên thị trường trong kinh nghiệm - Đối với một ví dụ thực hiện sử dụng các hàm này, xem Yêu cầu mua subscrip션 .
Tham khảo nhanh
Các bảng sau đây là một tài nguyên nhanh cho cách sử dụng RemoteEvents và RemoteFunctions để truyền thông giữa client và máy chủ.
Khách hàng → Server > | >|
---|---|
Khách hàng | RemoteEvent:FireServer(args) |
Máy Chủ | RemoteEvent.OnServerEvent:Connect(function(player, args)) |
Server → Client ” | ”|
Máy Chủ | RemoteEvent:FireClient(player, args) |
Khách hàng | RemoteEvent.OnClientEvent:Connect(function(args)) |
Server → Tất cả các khách hàng > | >|
Máy Chủ | RemoteEvent:FireAllClients(args) |
Khách hàng | RemoteEvent.OnClientEvent:Connect(function(args)) |
Sự kiệnRemote
Một RemoteEvent đối tượng dễ dàng hơn là giao tiếp asynchronous, one-way giữa client-server khi không cần phải yêu cầu một câu trả lời.
Để tạo một RemoteEvent mới thông qua cửa sổ Explorer ở Studio:
- Hover over the container into which you want to insert the RemoteEvent . In order to ensure both server and client truy cập, 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> .
- Nhấp vào nút ⊕ ở phía bên phải của tên container và nhúc nhích một instate RemoteEvent .
- Đổi tên instância để mô tả mục đích của nó.
Một khi bạn đã tạo một RemoteEvent, nó có thể dễ dàng thiết lập một cuộc giao tiếp một chiều từ client đến máy chủ, từ server đến client hoặc từ 2>server đến tất cả các khách hàng2>.
Client → Server
Bạn có thể sử dụng một LocalScript để kích hoạt một sự kiện trên máy chủ bằng cách gọ
Khách hàng | RemoteEvent:FireServer(args) |
Máy Chủ | RemoteEvent.OnServerEvent:Connect(function(player, args)) |
Các thành phần sau đây Script kết nối một người xử lý sự kiện đến Class.Remote
Kết Nối Sự Kiện - Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Nhận tham chiếu đến mô ví dụ / trường hợpsự kiện xa
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
-- Kết nối chức năng đến sự kiện
remoteEvent.OnServerEvent:Connect(onCreatePart)
Sự kiện phát - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Nhận tham chiếu đến mô ví dụ / trường hợpsự kiện xalocal remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")-- Kích hoạt sự kiệnRemote và truyền thêm các tham sốremoteEvent:FireServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))
Máy chủ → Khách hàng
Bạn có thể使用 a Class.Script
Máy Chủ | RemoteEvent:FireClient(player, args) |
Khách hàng | RemoteEvent.OnClientEvent:Connect(function(args)) |
Các thành phần sau đây LocalScript kết nối một hành động khởi tạo đến sự kiện OnClientEvent . Theo sau là một danh sách các thành phần Script để lắng nghe các người chơ
Kết Nối Sự Kiện - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Nhận tham chiếu đến mô ví dụ / trường hợpsự kiện xa
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
-- Kết nối chức năng đến sự kiện
remoteEvent.OnClientEvent:Connect(onNotifyPlayer)
Sự kiện phát - Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
-- Nhận tham chiếu đến mô ví dụ / trường hợpsự kiện xa
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Lắng nghe những người chơi đang đến và gửi một sự kiện xa tới mỗi người
local function onPlayerAdded(player)
print("[Server] Firing event to player", player.Name)
remoteEvent:FireClient(player, Players.MaxPlayers, Players.RespawnTime)
end
Players.PlayerAdded:Connect(onPlayerAdded)
Máy chủ → Tất cả các khách hàng
Bạn có thể sử dụng một Script để kích hoạt một sự kiện trên tất cả các khách hàng bằng c
Máy Chủ | RemoteEvent:FireAllClients(args) |
Khách hàng | RemoteEvent.OnClientEvent:Connect(function(args)) |
Các điều này kết nối một điều khiển sự kiện đến sự kiện LocalScript được thực hiện bằng cách thời gian đếm ngược còn lại. Điều này đ
Kết Nối Sự Kiện - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Nhận tham chiếu đến mô ví dụ / trường hợpsự kiện xa
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onTimerUpdate(seconds)
print(seconds)
end
-- Kết nối chức năng đến sự kiện
remoteEvent.OnClientEvent:Connect(onTimerUpdate)
Sự kiện phát - Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Nhận tham chiếu đến mô ví dụ / trường hợpsự kiện xalocal remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")local countdown = 5-- Kích hoạt sự kiện xa tại mỗi giây cho đến khi hết thời gianfor timeRemaining = -1, countdown doremoteEvent:FireAllClients(countdown - timeRemaining)task.wait(1)end
Gọi xa tay
Một RemoteFunction đối tượng dễ dàng hơn cho việc truyền đồng bộ, hai chiều trên biên giới client-server. Người gửi của một hành động xa tập trung sẽ đạt được cho đến khi nó nhận được một phản hồi từ người nhận.
Để tạo một RemoteFunction mới thông qua cửa sổ Explorer trong Studio:
- Hover over the container into which you want to insert the RemoteFunction . In order to ensure both server and client truy cập, 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> .
- Nhấp vào nút ⊕ ở phía bên phải của tên container và nhúc nhích một instate RemoteFunction .
- Đổi tên instância để mô tả mục đích của nó.
Một khi bạn đã tạo một RemoteFunction, nó có thể dễ dàng hơn hẳn hai chiều trò chuyện giữa client và server hoặc giữa server và client .
Khách hàng → Server → Khách hàng
Bạn có thể
Khách hàng | RemoteFunction:InvokeServer(args) |
Máy Chủ | RemoteFunction.OnServerInvoke = function(player, args) |
Các định nghĩa sau đây của Class.Script định nghĩa hàm gọi trả về Script và OnServerInvoke qua giá trị Part của nó. Bộ định
Kết Nối Điều Khiển - Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Nhận tham chiếu đến mô hình chức năng ví dụ / trường hợp
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Hàm chức năng
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
-- Đặt hàm như một hàm gọi xa
remoteFunction.OnServerInvoke = createPart
Sự kiện Invocation - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Nhận tham chiếu đến mô hình chức năng ví dụ / trường hợplocal remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")-- Truyền một màu và vị trí khi gọi hàmlocal newPart = remoteFunction:InvokeServer(Color3.fromRGB(255, 0, 0), Vector3.new(0, 25, -20))-- Tạo một chiếc tham chiếu cho phần đã được trả lạiprint("The server created the requested part:", newPart)
Máy chủ → Khách hàng → Máy chủ
Bạn có thể sử dụng một Script để gọi một hàm trên client bằng cách gọi phương thức InvokeClient() trên một RemoteFunction , nhưng nó có những rủi ro nghiêm trọng như sau:
- Nếu khách hàng ném một lỗi, máy chủ cũng ném lỗi.
- Nếu kết nối khách hàng bị mất kết nối trong khi nó đang được gọi, InvokeClient() ném một lỗi.
- Nếu khách hàng không trả lại giá trị, máy chủ sẽ tạo ra mã mãi mãi.
Đối với các hành động không yêu cầu giao tiếp hai chiều, chẳng hạn như cập nhật một GUI, hãy sử dụng một RemoteEvent và truyền tải từ máy chủ đến client .
Giới hạn biểu tượng
Khi bạn khởi động một RemoteEvent hoặc gọi một RemoteFunction , nó sẽ điều chuyển bất kỳ argument nào mà bạn truyền với sự kiện hoặc đến hàm đọc đ
Chỉ số không phải dạng chuỗi
Nếu bất kỳ 索引 của một bảng dữ liệu đã qua đều là những kiểu non-string như một Instance , userdata hoặc 1> function1> , Roblox tự động chuyển đổi những kiểu này thành dữ liệu chuỗi.
Kết Nối Sự Kiện - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> chuỗi
end
end
-- Kết nối chức năng đến sự kiện
remoteEvent.OnClientEvent:Connect(onEventFire)
Sự kiện phát - Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Lắng nghe những người chơi đang đến và gửi một sự kiện xa tới mỗi người
local function onPlayerAdded(player)
remoteEvent:FireClient(player,
{
[workspace.Baseplate] = true
}
)
end
Players.PlayerAdded:Connect(onPlayerAdded)
Các chức năng đã qua
Các hàm được bao gồm như các引数 cho một RemoteEvent hoặc RemoteFunction sẽ không bị sao chép qua giới hạn client-server nên không thể gửi các hàm đến bên nhận. Thay vào đó, hàm kết quả bên
Kết Nối Sự Kiện - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onClientEvent(func)
print(func) --> nil
end
remoteEvent.OnClientEvent:Connect(onClientEvent)
Sự kiện phát - Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function testFunction()
print("Hello world!")
end
-- Sự kiện FireRemote với chức năng là một引数
remoteEvent:FireAllClients(testFunction)
Tìm kiếm Bảng
Nếu bạn vượt qua một bảng dữ liệu, đừng vượt qua một bảng hỗn hợp của các chìa khóa số và chuỗi ký tự. Thay vào đó, vượt qua một bảng có tất cả các cặp giá trị chìa khóa (danh sách) hoặc tất cả các chỉ số (danh sách) của bảng.
Kết Nối Sự Kiện - Script
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 =Thanh kiếm
--> 2 = Cung
--> CharName = Diva Kẻ Giết Rồng
--> CharClass = Kẻ cướp
end
end
-- Kết nối chức năng đến sự kiện
remoteEvent.OnServerEvent:Connect(onEventFire)
Sự kiện phát - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")-- Bảng trích sốlocal inventoryData = {"Sword", "Bow"}-- Bảng từ điểnlocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}remoteEvent:FireServer(inventoryData)remoteEvent:FireServer(characterData)
Nhận dạng bảng
Các bảng được truyền làm mệnh lệnh cho các sự kiện/hồi gọi tại chỗ xa được sao chép, có nghĩa là chúng sẽ không hoàn toàn tương đương với những gì được cung cấp khi thực hiện sự kiện hoặc kêu gọi hồi gọi. Các bảng được
Kết Nối Điều Khiển - Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")
-- Hàm chức năng
local function returnTable(player, passedTable)
-- Tiết kiệm thời gian trong khi tạo bảng
print(tostring(passedTable)) --> bảng: 0x48eb7aead27563d9
return passedTable
end
-- Đặt hàm như một hàm gọi xa
remoteFunction.OnServerInvoke = returnTable
Sự kiện Invocation - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteFunction = ReplicatedStorage:FindFirstChildOfClass("RemoteFunction")local inventoryData = {"Sword", "Bow"}-- Hiển thị nhận dạng bảng gốcprint(tostring(inventoryData)) --> bảng: 0x059bcdbb2b576549local invokeReturn = remoteFunction:InvokeServer(inventoryData)-- Tạo mối quan hệ bảng trên trở lạiprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Các biến đổi
Nếu một bảng có một metatable, tất cả thông tin metatable được mất trong quá trình chuyển. Trong ví dụ mã sau đây, thuộc tính NumWheels là một trong những thuộc tính Car trong
Kết Nối Sự Kiện - Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
local function onEvent(player, param)
print(param) --> { ["Tên"] = "MyTruck"]
end
-- Kết nối chức năng đến sự kiện
remoteEvent.OnServerEvent:Connect(onEvent)
Sự kiện phát - 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)-- Sự kiện lửa với bảng dữ liệu bao gồm một bảng dữ liệuremoteEvent:FireServer(truck)
Các Instance không Replicated
Nếu một RemoteEvent hoặc một RemoteFunction truyền một giá trị mà chỉ người gửi mới có thể thấy, Roblox k
Sự kiện phát - Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
-- Sẽ được nhận là "nil" vì khách hàng không thể truy cập vào ServerStorage
local storedPart = Instance.new("Part")
storedPart.Parent = ServerStorage
local function onPlayerAdded(player)
remoteEvent:FireClient(player, storedPart)
end
Players.PlayerAdded:Connect(onPlayerAdded)
Tương tự như vậy, nếu bạn tạo một phần trong một LocalScript và thử gửi nó đến một Script , máy chủ sẽ thấy nil bởi vì phần này không thể bị sao chép cho máy chủ.
Sự kiện phát - LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")-- Sẽ được nhận là "nil" vì máy chủ không biết về phần nàylocal clientPart = Instance.new("Part")clientPart.Parent = workspaceremoteEvent:FireServer(clientPart)