เหตุการณ์เป็นเหตุการณ์ภายในเกมของคุณที่คุณสามารถฟังและตอบสนองได้ บริการและวัตถุหลายตัวใน Roblox มีเหตุการณ์ในตัวที่ เกิดขึ้น โดยอัตโนมัติในการตอบสนองต่อการกระทำหรือการเปลี่ยนแปลงเฉพาะ
ตัวอย่างเช่น Character ของผู้เล่นที่สัมผัสกับ BasePart จะทำให้เกิดเหตุการณ์ Touched โดยอัตโนมัติ ทุกครั้งที่ผู้เล่นเข้าร่วมเกมของคุณ เหตุการณ์ Players.PlayerAdded จะเกิดขึ้น
เนื่องจากจำนวนเหตุการณ์ที่มีมากและสถาปัตยกรรมลูกค้า-เซิร์ฟเวอร์ การเขียนสคริปต์ใน Roblox มักจะเรียกว่า ขับเคลื่อนด้วยเหตุการณ์ แนวทางนี้แตกต่างจากเกมเอนจิ้นอื่น ๆ หลายตัวที่เน้นการรันโค้ดแบบเฟรมต่อเฟรม
คุณไม่จำเป็นต้องฟังเหตุการณ์หรือดำเนินการใด ๆ ในการตอบสนองต่อพวกเขา แต่เหตุการณ์ก็ยังเกิดขึ้นและมีให้ใช้งาน เมื่อคุณต้องการตอบสนองต่อเหตุการณ์ คุณต้องเชื่อมต่อฟังก์ชันกับมัน
เชื่อมต่อฟังก์ชันกับเหตุการณ์
คุณเชื่อมต่อฟังก์ชันกับเหตุการณ์โดยใช้ Connect() เพื่อดำเนินโค้ดทุกครั้งที่เหตุการณ์เกิดขึ้น เหตุการณ์ส่วนใหญ่จะส่งพารามิเตอร์ไปยังฟังก์ชันที่เชื่อมต่อ สำหรับตัวอย่าง เหตุการณ์ BasePart.Touched จะส่งวัตถุที่สัมผัสกับส่วน (เช่นมือซ้ายหรือล้อรถยนต์) และเหตุการณ์ Players.PlayerAdded จะส่ง Player ที่เข้าร่วมเกมของคุณ
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีเชื่อมต่อฟังก์ชันชื่อ onPartTouched() กับเหตุการณ์ Touched ของส่วน:
-- สมมติว่ากำลังทำงานในส่วน
local part = script.Parent
-- ฟังก์ชันที่คุณต้องการให้ทำงาน
local function onPartTouched(object)
print("ส่วนถูกสัมผัสโดย", object:GetFullName())
end
-- เชื่อมต่อฟังก์ชันกับเหตุการณ์ Touched ของส่วน
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("ส่วนถูกตีที่เป้าหมาย!")
-- ตัดการเชื่อมต่อ
connection:Disconnect()
end
end
-- เชื่อมต่อฟังก์ชันข้างบนกับเหตุการณ์ Touched
connection = part.Touched:Connect(onPartTouched)
รอให้เหตุการณ์เกิดขึ้น
หากคุณต้องการให้สคริปต์หยุดรอจนกว่าเหตุการณ์เฉพาะจะเกิดขึ้น ใช้ Wait() วิธีนี้จะคืนค่าพารามิเตอร์ของเหตุการณ์ซึ่งคุณสามารถกำหนดให้กับตัวแปรเพื่อการใช้งานในภายหลัง:
local Workspace = game:GetService("Workspace")local part = Workspace.Partlocal touchedPart = part.Touched:Wait()print("ส่วนถูกสัมผัสโดย", touchedPart:GetFullName())
ประเภทอื่นของเหตุการณ์
เหตุการณ์แบบ Bindable ช่วยให้คุณสื่อสารระหว่างสคริปต์ใน ฝั่งเดียวกัน ของขอบเขตลูกค้า-เซิร์ฟเวอร์
เหตุการณ์แบบ Remote ช่วยให้คุณสื่อสาร ข้าม ขอบเขตลูกค้า-เซิร์ฟเวอร์
เหตุการณ์ของเครื่องยนต์ที่เลื่อนออก จะเลื่อนการจัดการเหตุการณ์ออกไปจนกว่าจะถึงจุดการกลับสู่สภาวะปกติบางจุด