يتيح لك نظام إجراءات الإدخال عبر المنصات ربط الإجراءات وترتيب التعيينات عبر مدخلات الأجهزة المختلفة في وقت التحرير. بالاشتراك مع السياقات، يمكنك بسهولة تكوين وتحرير نظام إدخال معياري يعمل على أي جهاز في أي مرحلة من اللعب. تشمل حالات الاستخدام:
- نظام إطلاق نار من منظور الشخص الأول مع إجراءات تتبدل ديناميكيًا اعتمادًا على ما إذا كان اللاعب في وضع المعركة أو وضع المتفرج.
- نظام قيادة شامل مزود بتسارع/تباطؤ، معززات للسيارة، ومحطات إعادة تعبئة.
- مفاتيح سريعة لنظام القدرات في لعبة قتال لتبديل الحركات بسلاسة دون أن يفوت اللاعبين ضربة.
سياقات الإدخال
InputContext هو مجموعة من الإجراءات التي تحتوي على إجراءات الإدخال ذات الصلة، على سبيل المثال PlayContext للتحكم في الشخصيات داخل اللعبة وNavContext للتحكم في التنقل حول قوائم واجهة المستخدم. يمكنك تمكين/تعطيل السياقات (وإجراءاتها المقابلة) من خلال خاصية Enabled الخاصة بها، مثل تمكين NavContext عند فتح قائمة الجرد ثم التغيير إلى PlayContext عندما يغلق اللاعب القائمة ويعود إلى اللعب الأساسي.
حتى إذا لم يستخدم اللعبة عدة سياقات إدخال في البداية، يُوصى بإنشاء سياق أساسي على المستوى الأعلى من أي نظام إدخال، على سبيل المثال، مثيل PlayContext للإدخال الذي يحدث أثناء اللعب.
أدخل InputContext جديدًا في المجلد وأعد تسميته إلى PlayContext.

- اختياريفي نافذة الخصائص، قم بتعيين Priority إلى 2000 وتمكين Sink. السياق الذي تم تمكين Sink له يستهلك أحداث الإدخال لتعييناته المرتبطة KeyCodes على مستوى أولويته، مما يمنع تلك المدخلات من الوصول إلى السياقات ذات الأولوية الأقل. هذا عملي لحالات الاستخدام مثل شاشة الجرد التي يجب أن تخفف من مدخلات اللعب المحددة أثناء فتحها. في هذا المثال، تم إعطاء PlayContext أولوية Priority عالية بما يكفي لتغمر مدخلاتها المرتبطة قبل أن تعالجها السياقات الافتراضية PlayerScripts.

إجراءات الإدخال
InputAction تعرف آلية إجراء اللعب مثل "قفز"، "ركض"، أو "إطلاق النار". يتم بعد ذلك ربط هذه الإجراءات بمدخلات الأجهزة باستخدام التعيينات.
يمكن أن تكون InputAction من عدة أنواع اعتمادًا على خاصية Type (Enum.InputActionType). الافتراضي هو Bool، المصمم لاستقبال قيم true/false من الضغط/الإفراج عن المدخلات مثل ButtonA، E، أو MouseLeftButton.
| نوع إجراء الإدخال | مثال على الاستخدام |
|---|---|
| Bool | إجراءات تم تفعيلها مثل القفز، الإطلاق، الركض، إلخ، مع دعم لعتبات الضغط/الإفراج على المدخلات التناظرية. |
| Direction1D | إجراءات متغيرة من صفر إلى كامل مثل دواسة تسارع السيارة أو مستوى تكبير نطاق العرض. |
| Direction2D | حركة اتجاهية ثنائية الأبعاد مثل دوران الكاميرا، أو حركة الشخصية القياسية في Roblox. |
| Direction3D | حركة اتجاهية ثلاثية الأبعاد مثل مركبة جوية يمكن أن تطفو لأعلى/أسفل، تتسارع/تتباطأ، وتنحرف لليسار/اليمين. |
| ViewportPosition | إحداثيات عرض ثنائية الأبعاد مثل إدخال الفأرة، مثل المؤشرات المخصصة أو استخدام الأشعة لاختيار كائنات العالم. |
لاختبار InputAction لركض الشخصية البسيط:
- موصى بهحدد كائن Workspace على المستوى الأعلى في مستكشف ثم، في نافذة الخصائص، قم بتعيين خاصية PlayerScriptsUseInputActionSystem إلى Enabled.
أنشئ InputAction جديدًا داخل سياق PlayContext ضمن ReplicatedStorage. أعد تسميته إلى CharacterSprint للإشارة إلى إجراءه المخصص.

تعيينات الإدخال
InputBinding تعرف أي تعيين للأجهزة يجب أن يثير InputAction الأصل، على سبيل المثال، ضغط مفتاح، زر وحدة تحكم، أو لمسة على جهاز يدعم اللمس. لضمان التوافق عبر المنصات، يجب أن تحتوي كل InputAction على InputBinding لـ وحدة التحكم، لوحة المفاتيح/الفأرة، واللمس كما هو موضح هنا.

توفر Roblox تركيبات إدخال افتراضية للحركة، والتحكم في الكاميرا، والتفاعل الأساسي مع البيئة — يعرف لاعبو Roblox هذه العناصر بشكل جيد، لذا يجب عليك تجاوزها فقط في حالات محددة. لاحظ أيضًا أن الإدخالات المحجوزة لا يمكن تجاوزها وستعمل دائمًا وفقًا لغرضها المقصود.
| الإجراء | الفأرة/لوحة المفاتيح | وحدة التحكم | اللمس |
|---|---|---|---|
| فتح قائمة Roblox | Esc | Start button (ButtonStart) | غير متاح |
| وحدة تحكم المطور | F9 | غير متاح | غير متاح |
| وضع ملء الشاشة (Windows) عرض سطح المكتب (Mac) | F11 | غير متاح | غير متاح |
| تسجيل الفيديو (Windows) | F12 | غير متاح | غير متاح |
| التقاط صورة الشاشة | PrintScreen | غير متاح | غير متاح |
تؤثر Type المعينة لـ InputAction الأصل مباشرة على أنواع الإدخال العامة (مفتاح/زر/لمسة، زناد تناظري، عصا التحكم، إلخ) التي تكون صالحة لمثيلات InputBinding الفرعية. بدورها، تعتمد القيم المرسلة إلى أحداث InputAction المتصلة على نوع الإدخال المختار للتعيين. انظر أحداث الإدخال للحصول على تفاصيل حول العلاقة بين أنواع الإجراءات، التعيينات، والقيم المرجعة.
لربط التعيينات لركض الشخصية البسيط:
أدخل InputBinding جديدًا في إجراء CharacterSprint وأعد تسميته إلى KeyboardBinding. ثم قم بتعيين خاصية KeyCode للتعيين إلى LeftShift.


أدخل InputBinding ثانيًا في إجراء CharacterSprint وأعد تسميته إلى GamepadBinding. ثم قم بتعيين خاصية KeyCode للتعيين إلى ButtonY.


داخل حاوية ScreenGui داخل StarterGui، أنشئ زر على الشاشة، وأعد تسميته إلى SprintButton، وقم بتحديد موضعه/حجمه كما تريد.


أدخل InputBinding ثالثًا في إجراء CharacterSprint وأعد تسميته إلى TouchBinding. ثم، في نافذة الخصائص، اربط خاصية UIButton للتعيين بزر SprintButton الذي أنشأته سابقًا داخل StarterGui.


أحداث الإدخال
تحتوي مثيل InputAction على ثلاث أحداث مدمجة للتعامل مع إدخال اللاعب القادم من InputBindings.
- StateChanged — يتم تشغيل هذا الحدث لجميع أنواع إجراءات الإدخال كلما تغيرت الحالة، باستثناء إذا كانت الحالة تحاول الانتقال إلى نفس الحالة.
اعتمادًا على Type لإجراء الإدخال (Bool، Direction1D، Direction2D، Direction3D، أو ViewportPosition) ونوع الإدخال العام القادم من InputBinding الفرعية (مفتاح/زر/لمسة، زناد تناظري، عصا التحكم، إلخ)، يتم إرجاع قيم مختلفة إلى معالجات أحداث Pressed، Released، وStateChanged. افحص الجداول التالية لفهم العلاقة بشكل أفضل.
نوع Bool هو الأفضل للإجراءات المفعلة مثل القفز، الإطلاق، الركض، إلخ، مع دعم لعتبات الضغط/الإفراج على المدخلات التناظرية.
| أنواع الإدخال الصالحة على InputBindings | المُرجع إلى حدث InputAction(ات) |
|---|---|
| مدخلات منطقية من مفاتيح لوحة المفاتيح أو أزرار الفأرة/وحدة التحكم الأساسية من خلال خاصية KeyCode للتعيين، أو ضغط/إفراج GuiButton من خلال خاصية UIButton للتعيين. |
|
| مدخلات متغيرة من المدخلات التناظرية مثل زنادات وحدة التحكم (ButtonL2/ButtonR2) من خلال خاصية KeyCode للتعيين. |
|
لربط الأحداث لركض الشخصية البسيط:
أدخل Script جديدًا في شجرة CharacterSprint، بجانب التعيينات المختلفة. ثم قم بتعيين RunContext إلى Client وأعد تسميته إلى OnActivate.

الصق الكود التالي في نص OnActivate. لاحظ الاتصال بحدث Pressed في الأسطر 13‑15 الذي يضاعف سرعة مشي الشخصية عندما يتم الضغط على تعيين إدخال الركض، والاتصال المقابل بحدث Released في الأسطر 16‑18 الذي يعيد تعيين سرعة المشي إلى الافتراضي عندما يتم الإفراج عن تعيين إدخال الركض.
OnActivate (Client Script)local Players = game:GetService("Players")local player = Players.LocalPlayerlocal character = player.Characterif not character or character.Parent == nil thencharacter = player.CharacterAdded:Wait()endlocal humanoid = character:WaitForChild("Humanoid")local defaultWalkSpeed = humanoid.WalkSpeedlocal inputAction = script.ParentinputAction.Pressed:Connect(function()humanoid.WalkSpeed = defaultWalkSpeed * 2end)inputAction.Released:Connect(function()humanoid.WalkSpeed = defaultWalkSpeedend)اختبر لعبتك واختبر إجراء الركض للشخصية مع التعيينات التي اخترتها سابقًا: LeftShift للوحة المفاتيح، ButtonY لوحدة التحكم، وزر SprintButton على الشاشة للأجهزة التي تدعم اللمس. تذكر أنه يمكنك استخدام محاكي وحدة التحكم لاختبار مدخلات وحدة التحكم مباشرة في Roblox Studio.
تغييرات السياق
بمجرد أن يكون لديك سياق إدخال مثل PlayContext، يمكنك تمكينه/تعطيله أثناء اللعب من خلال البرمجة، وتغيير Priority الخاصة به لتحديد أي الإجراءات تأخذ الأولوية على الأخرى، وSink المدخلات من أن تتم معالجتها ضمن السياقات ذات الأولوية الأقل.
لتسهيل تبديل السياقات من نصوص أخرى، أدخل BindableEvent جديدًا في مجلد الإدخالات الخاص بك داخل ReplicatedStorage وأعد تسميته إلى ContextEvent.

أنشئ Script جديدًا على نفس المستوى، وقم بتعيين RunContext إلى Client، وأعد تسميته إلى UpdateContext.

داخل نص UpdateContext، الصق الكود التالي:
UpdateContext (Client Script)local ReplicatedStorage = game:GetService("ReplicatedStorage")local inputsFolder = ReplicatedStorage:WaitForChild("Inputs")local contextEvent = inputsFolder:WaitForChild("ContextEvent")-- الاتصال بحدث قابل للتوصيلcontextEvent.Event:Connect(function(targetContext, enabled)local context = inputsFolder:FindFirstChild(targetContext)if context thencontext.Enabled = enabledprint(context.Name .. ": " .. tostring(context.Enabled))elsewarn("InputContext غير موجود!")endend)مع وجود نص UpdateContext في مكانه، يمكنك الآن تحديث InputContext المسماة عن طريق إطلاق الحدث القابل للتوصيل، على سبيل المثال من LocalScript الذي يشغل GuiButton داخل حاوية ScreenGui.
نص الزرlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local inputsFolder = ReplicatedStorage:WaitForChild("Inputs")local contextEvent = inputsFolder:WaitForChild("ContextEvent")local button = script.Parentbutton.Activated:Connect(function()-- إطلاق الحدث القابل للتوصيل مع السياق المستهدف وحالة التمكينcontextEvent:Fire("PlayContext", true)end)
عرض التعيينات
بمجرد إعدادك لـ الإجراءات والتعيينات، ستحتاج عادةً إلى إظهار للاعبين، عبر تلميحات مساعدة على الشاشة، أي مفتاح أو زر يثير كل إجراء:

يوفر نظام إجراءات الإدخال طريقتين:
- موصى بهInputActionLabel — كائن GuiObject بدون كود، يمكن سحبه وإفلاته يعرض تلقائيًا الإدخال الصحيح لكل منصة.
- متوسطPreferredBinding — خاصية InputAction للقراءة فقط للمبدعين الذين يريدون السيطرة الكاملة على كيفية عرض التعيينات في واجهة المستخدم المخصصة.
InputActionLabel هو GuiObject يمكنك إدراجه في أي ScreenGui أو SurfaceGui. بمجرد تعيين خاصية InputAction للإشارة إلى مثيل InputAction موجود، فإنه يحل تلقائيًا ويعرض التعيين الصحيح لجهاز الإدخال الحالي للاعب — لا حاجة للبرمجة. عندما يقوم اللاعب بتبديل الأجهزة (على سبيل المثال، التقاط وحدة تحكم بعد استخدام لوحة مفاتيح) أو إعادة تعيين تحكم، يتم تحديث التسمية على الفور.
لإضافة InputActionLabel:
داخل حاوية ScreenGui داخل StarterGui، أدخل InputActionLabel تمامًا مثل أي GuiObject آخر.
في نافذة الخصائص، قم بتعيين خاصية InputAction إلى مثيل InputAction الذي تريد عرضه (على سبيل المثال، إجراء "الركض" الخاص بك تحت ReplicatedStorage) وقم بتحديد موضعه/حجمه كما تريد.
عندما تحل التسمية ما يجب عرضه، تتحقق من التالي بالترتيب:
صور مخصصة — إذا كانت خاصية InputBindings الفرعية قد تم تعيينها إلى DisplayImage، فإن التسمية تعرض تلك الصور مباشرة.
صور مفاتيح المنصة — في حالة عدم وجود صور مخصصة، فإن التسمية تعرض الصور المقدمة من المنصة لـ InputBindings من خلال UserInputService:GetImageForKeyCode()، إذا كانت تلك الصور متاحة. تظهر التعيينات المركبة مع المعدلات عدة أيقونات مع فواصل +.
أسماء مخصصة — في حالة عدم توفر صور، إذا كانت خاصية InputBindings الفرعية قد تم تعيينها إلى DisplayName، فإن التسمية تعرض ذلك النص باستخدام خصائص نمط التسمية.
سلاسل مفاتيح المنصة — في حالة عدم توفر كل ما سبق، فإن التسمية تعرض السلاسل المقدمة من المنصة من خلال UserInputService:GetStringForKeyCode().
إذا لم يتم تعيين أي InputAction أو لم يكن هناك أي InputBinding فرعي موجود، فإن التسمية تعرض أيقونة عنصر نائب.
مدير إجراءات الإدخال
أداة مدير إجراءات الإدخال هي واجهة موحدة على شكل مصفوفة لتصميم، تدقيق، وتوسيع بنية الإدخال الخاصة بك.
للوصول إليها، انتقل إلى قائمة نافذة في الاستوديو واختر إدخال ⟩ مدير إجراءات الإدخال. إذا كانت لعبتك تستخدم بالفعل السياقات أو الإجراءات أو التعيينات، فسيقوم المدير تلقائيًا بمسح DataModel واستخراج تلك المثيلات الموجودة إلى شبكة المحرر. سيتم تلقائيًا ملء أي مثيلات جديدة ذات صلة بالإدخال في مجلد Inputs داخل ReplicatedStorage.

لتكوين إعداد إدخال لـ ركض الشخصية كما هو موضح في الأقسام أعلاه:
- موصى بهحدد كائن Workspace على المستوى الأعلى في مستكشف ثم، في نافذة الخصائص، قم بتعيين خاصية PlayerScriptsUseInputActionSystem إلى Enabled.
داخل حاوية ScreenGui داخل StarterGui، أنشئ زر على الشاشة، وأعد تسميته إلى SprintButton، وقم بتحديد موضعه/حجمه كما تريد.

في مدير إجراءات الإدخال، مرر فوق رأس عمود السياق وانقر على زر +. أدخل اسمًا مناسبًا للسياق الجديد مثل PlayContext واضغط Enter. يظهر InputContext بالاسم المطابق في ReplicatedStorage.


مرر فوق السياق الجديد وانقر على زر +. من قائمة المنبثقة، اختر Bool، أدخل CharacterSprint كاسم للإجراء، واضغط Enter. يظهر InputAction بالاسم المطابق تحت السياق.


أدخل Script جديدًا في شجرة CharacterSprint، بجانب التعيينات المختلفة. ثم قم بتعيين RunContext إلى Client وأعد تسميته إلى OnActivate.

الصق الكود التالي في نص OnActivate. لاحظ الاتصال بحدث Pressed في الأسطر 13‑15 الذي يضاعف سرعة مشي الشخصية عندما يتم الضغط على تعيين إدخال الركض، والاتصال المقابل بحدث Released في الأسطر 16‑18 الذي يعيد تعيين سرعة المشي إلى الافتراضي عندما يتم الإفراج عن تعيين إدخال الركض.
OnActivate (Client Script)local Players = game:GetService("Players")local player = Players.LocalPlayerlocal character = player.Characterif not character or character.Parent == nil thencharacter = player.CharacterAdded:Wait()endlocal humanoid = character:WaitForChild("Humanoid")local defaultWalkSpeed = humanoid.WalkSpeedlocal inputAction = script.ParentinputAction.Pressed:Connect(function()humanoid.WalkSpeed = defaultWalkSpeed * 2end)inputAction.Released:Connect(function()humanoid.WalkSpeed = defaultWalkSpeedend)

