الأحداث هي وقوعات داخل لعبتك يمكنك الاستماع إليها والاستجابة لها. العديد من خدمات وأشياء 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())
أنواع أخرى من الأحداث
الأحداث القابلة للربط تتيح لك التواصل بين السكربتات على نفس الجانب من حدود العميل والخادم.
الأحداث النائية تتيح لك التواصل عبر حدود العميل والخادم.
أحداث محرك مؤجلة تؤجل معالجات الأحداث حتى نقاط استئناف معينة.