อีเวนต์คือเหตุการณ์ภายในประสบการณ์ของคุณที่คุณสามารถฟังและตอบสนองได้บริการและวัตถุ Roblox จํานวนมากมีกิจกรรมที่ติดตั้งไว้ล่วงหน้าที่จะเรียกใช้อัตโนมัติ ไฟ ในการตอบสนองต่อการกระทําหรือการเปลี่ยนแปลงที่เฉพาะเจาะจง
ตัวอย่างเช่น ผู้เล่น Character สัมผัส BasePart อัตโนมัติจะเรียกการเหตุการณ์ Touchedทุกครั้งที่ผู้เล่นเข้าร่วมประสบการณ์ของคุณ การเหตุการณ์ Players.PlayerAdded จะเกิดขึ้น
เนื่องจากจํานวนเหตุการณ์และสถาปัตยกรรมไคลเอนต์-เซิร์ฟเวอร์ที่มาก การสคริปต์ของ Roblox มักจะเรียกว่า ขับเคลื่อนด้วยเหตุการณ์ วิธีนี้แตกต่างจากเครื่องเกมอื่นๆ จำนวนมากที่เน้นการรันโค้ดบนพื้นฐานของเฟรมต่อเฟรม
คุณไม่จำเป็นต้องฟังเหตุการณ์หรือดำเนินการใดๆ ตอบสนองต่อพวกเขา แต่เหตุการณ์กำลังยิงและมีอยู่แม้ว่าจะเป็นเช่นนั้นเมื่อคุณต้องการตอบสนองต่อเหตุการณ์ คุณจะเชื่อมฟังก์ชันกับมัน
เชื่อมฟังก์ชันกับอีเวนต์
คุณเชื่อมฟังก์ชันกับอีเวนต์โดยใช้ Connect() เพื่อดําเนินโค้ดในแต่ละครั้งที่อีเวนต์จะเกิดขึ้นเหตุการณ์ส่วนใหญ่ส่งอาร์กิวเมนต์ไปยังฟังก์ชันที่เชื่อมต่อกันตัวอย่างเช่น อีเวนต์ BasePart.Touched ส่งวัตถุที่สัมผัสชิ้นส่วน (เช่นมือซ้ายหรือล้อรถ) และอีเวนต์ Players.PlayerAdded ส่งวัตถุ Player ที่เข้าร่วมประสบการณ์ของคุณ
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีเชื่อมต่อฟังก์ชันชื่อ onPartTouched() กับอีเวนต์ Touched ของส่วน:
-- คาดว่าสคริปต์จะเป็นลูกของส่วน
local part = script.Parent
-- ฟังก์ชันที่คุณต้องการที่จะรัน
local function onPartTouched(object)
print("Part was touched by", object:GetFullName())
end
-- เชื่อมฟังก์ชันกับอีเวนต์ที่สัมผัสของส่วน
part.Touched:Connect(onPartTouched)
คุณยังสามารถเชื่อมต่อ ฟังก์ชันไม่ระบุชื่อ กับเหตุการณ์เมื่อคุณต้องการใช้ตัวแปรในขอบเขตพ่อและไม่จำเป็นต้องใช้ฟังก์ชันที่อื่นตัวอย่างโค้ดนี้หลีกเลี่ยงฟังก์ชันตัวกลางที่น่าอายใจจากตัวอย่างที่คล้ายกันใน บริการ :
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
-- ฟังก์ชันไม่ระบุชื่อที่เรียก saveProgress() เมื่อลบตัวละคร
-- จากประสบการณ์ (ในกรณีนี้เมื่อผู้เล่นออก)
Players.PlayerAdded:Connect(function(player)
player.CharacterRemoving:Connect(saveProgress)
end)
ตัดการเชื่อมต่อฟังก์ชันจากอีเวนต์
วิธี Connect() จะคืนวัตถุ RBXScriptConnectionหากคุณเชื่อมฟังก์ชันกับอีเวนต์ แต่ไม่ต้องการเรียกฟังก์ชันในครั้งต่อไปที่อีเวนต์จะเกิดขึ้น (เช่นหลังจากตรงตามเงื่อนไขบางอย่าง) ให้ถอดการเชื่อมต่อโดยเรียก Disconnect() บนวัตถุ RBXScriptConnection
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีเชื่อมต่อและถอดการเชื่อมต่อฟังก์ชันจากเหตุการณ์ Part.Touched:
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local targetPart = Workspace.TargetPart
-- ประกาศตัวแปรชั่วคราวว่างเปล่าสำหรับการเชื่อมต่อ
local connection
local function onPartTouched(otherPart)
if otherPart == targetPart then
print("The part hit the target!")
-- แยกการเชื่อมต่อ
connection:Disconnect()
end
end
-- เชื่อมฟังก์ชันด้านบนไปยังอีเวนต์ที่สัมผัส
connection = part.Touched:Connect(onPartTouched)
หากคุณต้องการเชื่อมฟังก์ชันกับอีเวนต์เพียงครั้งเดียวเท่านั้น—นั่นคือเฉพาะทำงานฟังก์ชันในครั้งแรกที่อีเวนต์จะเกิดขึ้น—ใช้วิธี Once() เป็นทางเลือกที่สะดวกกว่าในการเชื่อมต่อและถอดการเชื่อมต่อฟังก์ชัน
รอให้เหตุการณ์เกิดขึ้น
หากต้องการให้สคริปต์ทำงานจนกว่าจะเกิดเหตุการณ์เฉพาะ ให้ใช้วิธี Wait()วิธีนี้จะคืนอาร์กิวเมนต์ของอีเวนต์ซึ่งคุณสามารถกำหนดให้แก่ตัวแปรสำหรับใช้ในภายหลัง:
local Workspace = game:GetService("Workspace")local part = Workspace.Partlocal touchedPart = part.Touched:Wait()print("The part was touched by", touchedPart:GetFullName())
ประเภทอีเวนต์อื่นๆ
อีเวนต์ที่สามารถผูกได้ช่วยให้คุณสื่อสารระหว่างสคริปต์ ในด้านเดียวกัน ของขอบเขตไคลเอนต์-เซิร์ฟเวอร์
อีเวนต์ระยะไกลช่วยให้คุณสื่อสาร ข้าม ขอบเขตไคลเอนต์-เซิร์ฟเวอร์