Sự kiện là những xảy ra trong trò chơi của bạn mà bạn có thể lắng nghe và phản hồi. Nhiều dịch vụ và đối tượng trong Roblox có các sự kiện tích hợp sẵn mà tự động bắn ra để phản hồi các hành động hoặc thay đổi cụ thể.
Ví dụ, khi Character của một người chơi chạm vào BasePart, sự kiện Touched sẽ tự động được kích hoạt. Mỗi lần một người chơi tham gia trò chơi của bạn, sự kiện Players.PlayerAdded sẽ được kích hoạt.
Do số lượng sự kiện nhiều và kiến trúc máy khách-máy chủ, lập trình Roblox thường được gọi là dựa trên sự kiện. Cách tiếp cận này khác với nhiều engine game khác, nhấn mạnh việc chạy mã theo từng khung hình.
Bạn không cần phải lắng nghe các sự kiện hoặc thực hiện bất kỳ hành động nào để phản hồi chúng, nhưng các sự kiện vẫn đang được kích hoạt và có sẵn. Khi bạn muốn phản hồi một sự kiện, bạn kết nối một hàm với nó.
Kết nối hàm với các sự kiện
Bạn kết nối một hàm với một sự kiện bằng cách sử dụng Connect() để thực thi mã mỗi khi sự kiện được kích hoạt. Hầu hết các sự kiện sẽ truyền các tham số tới các hàm đã kết nối của chúng. Ví dụ, sự kiện BasePart.Touched sẽ truyền đối tượng đã chạm vào phần (như một bàn tay trái hoặc bánh xe ô tô), và sự kiện Players.PlayerAdded sẽ truyền Player đã tham gia trò chơi của bạn.
Đoạn mã mẫu sau đây minh họa cách kết nối một hàm tên là onPartTouched() với sự kiện Touched của một phần:
-- Giả định rằng script này là cha của phần
local part = script.Parent
-- Hàm bạn muốn chạy
local function onPartTouched(object)
print("Phần đã được chạm bởi", object:GetFullName())
end
-- Kết nối hàm với sự kiện Touched của phần
part.Touched:Connect(onPartTouched)
Bạn cũng có thể kết nối các hàm ẩn danh với các sự kiện khi bạn muốn sử dụng các biến trong phạm vi cha và không cần sử dụng hàm ở nơi khác. Ví dụ, đoạn mã này tránh việc sử dụng hàm trung gian khó xử từ đoạn mã tương tự trong Services:
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SaveManager = require(ReplicatedStorage:WaitForChild("SaveManager"))
local function saveProgress(character)
local position = character:FindFirstChild("HumanoidRootPart").Position
SaveManager.saveData(character, position)
end
-- Hàm ẩn danh gọi saveProgress() khi một nhân vật bị xóa
-- khỏi trò chơi (trong trường hợp này, khi người chơi rời đi).
Players.PlayerAdded:Connect(function(player)
player.CharacterRemoving:Connect(saveProgress)
end)
Ngắt kết nối hàm từ các sự kiện
Phương thức Connect() trả về một đối tượng RBXScriptConnection. Nếu bạn kết nối một hàm với một sự kiện, nhưng không muốn gọi hàm đó lần tới khi một sự kiện được kích hoạt (chẳng hạn như sau khi một điều kiện được thỏa mãn), hãy ngắt kết nối bằng cách gọi Disconnect() trên đối tượng RBXScriptConnection.
Đoạn mã mẫu sau đây cho thấy cách kết nối và ngắt kết nối một hàm từ sự kiện Part.Touched:
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local targetPart = Workspace.TargetPart
-- Khai báo một biến placeholder trống cho kết nối
local connection
local function onPartTouched(otherPart)
if otherPart == targetPart then
print("Phần đã chạm vào mục tiêu!")
-- Ngắt kết nối
connection:Disconnect()
end
end
-- Kết nối hàm trên với sự kiện Touched
connection = part.Touched:Connect(onPartTouched)
Chờ đợi các sự kiện kích hoạt
Nếu bạn muốn một script chờ đợi cho đến khi một sự kiện cụ thể được kích hoạt, hãy sử dụng phương thức Wait(). Phương thức này trả về các tham số của sự kiện, mà bạn có thể gán cho các biến để sử dụng sau này:
local Workspace = game:GetService("Workspace")local part = Workspace.Partlocal touchedPart = part.Touched:Wait()print("Phần đã được chạm bởi", touchedPart:GetFullName())
Các loại sự kiện khác
Sự kiện có thể liên kết cho phép bạn giao tiếp giữa các script ở cùng một bên của ranh giới máy khách-máy chủ.
Sự kiện từ xa cho phép bạn giao tiếp qua ranh giới máy khách-máy chủ.
Sự kiện bộ máy trì hoãn trì hoãn các trình xử lý sự kiện cho đến các điểm khôi phục nhất định.