أجهزة كشف السحب في واجهة المستخدم

*This content is translated using AI (Beta) and may contain errors. To view this page in English, click here.

تساعد مثيلات UIDragDetector على تسهيل وتشجيع التفاعل مع عناصر واجهة المستخدم ثنائية الأبعاد في تجربة، مثل المنزلقات، وآلات الدوران، والمزيد. تتضمن الميزات الرئيسية:

  • ضع UIDragDetector تحت أي مثيل من GuiObject لجعله قابلاً للسحب عبر جميع مدخلات المستخدم دون سطر واحد من التعليمات البرمجية.

  • اختر من بين العديد من خيارات DragStyle، وحدد كيفية استجابة الكائن للحركة عبر ResponseStyle، وطبق حدود المحاور أو الحركة، أو قيود السحب إذا رغبت في ذلك.

  • يمكن للبرامج النصية الاستجابة لتلاعب الكائنات المسحوبة لتوجيه الاستجابات المنطقية، مثل ضبط الإعدادات.

  • تعمل UIDragDetectors في وضع التحرير والتشغيل في الاستوديو طالما أنك لا تستخدم أدوات التحديد، والحركة، والتغيير في الحجم، أو التدوير، ولا تستخدم بعض الإضافات أو أدوات محرر واجهة المستخدم في الاستوديو.

جعل عناصر واجهة المستخدم قابلة للسحب

لجعل أي مثيل من GuiObject قابلاً للسحب، ما عليك سوى إضافة UIDragDetector كابن مباشر.

  1. في نافذة المستعرض، قم بالتحويم فوق مثيل GuiObject وانقر على زر ⊕. تظهر قائمة سياقية.

  2. من القائمة، قم بإدراج UIDragDetector.

  3. بشكل افتراضي، سيكون الكائن الآن قابلاً للسحب في واجهة LayerCollector.

تخصيص أجهزة كشف سحب واجهة المستخدم

نمط السحب

تقوم UIDragDetectors بربط حركة المؤشر لحساب الحركة الثنائية الأبعاد المقترحة و/أو الدوران. من خلال خاصية DragStyle، يمكنك الاختيار من بين خرائط مختلفة لتلبية احتياجاتك. على سبيل المثال، ينتج عن Enum.UIDragDetectorDragStyle.TranslatePlane ترجمة في المستوى الثنائي الأبعاد لـ LayerCollector، بينما عادةً ما ينتج عن Enum.UIDragDetectorDragStyle.Rotate دوران بدلاً من الترجمة.

الإعدادالوصف
TranslateLineحركة أحادية البعد على طول DragAxis للموصل.
TranslatePlaneحركة ثنائية الأبعاد في المستوى الخاص بـ LayerCollector.
Rotateبشكل افتراضي، دوران حول المركز المطلق لمثيل GuiObject الأبوين للموصل. إذا تم تعيين ReferenceUIInstance، يحدث الدوران حول المركز المطلق لتلك المثيل.
Scriptableيحسب الحركة المطلوبة عبر وظيفة مخصصة يتم تقديمها من خلال SetDragStyleFunction().

اتجاه السحب

بشكل افتراضي، يتم ربط الحركة الثنائية الأبعاد وDragStyle المرتبطة بمساحة سلف LayerCollector. ومع ذلك، قد ترغب في تغيير ReferenceUIInstance أو DragAxis عند بناء مكونات واجهة مستخدم مختلفة.

الإعدادالوصفالقيمة الافتراضية
ReferenceUIInstanceمثيل GuiObject الذي تعتبر مساحته المحلية ومركزه المطلق هو المساحة المرجعية والأصل للموصل. يؤثر تعيين هذه المرجعية على خصائص مثل DragUDim2، وDragRotation، وسلوك DragAxis.nil
DragAxisقيمة Vector2 التي تحدد محور الحركة للكائن المسحوب عند تعيين DragStyle إلى Enum.UIDragDetectorDragStyle.TranslateLine. يتم تعريف المحور في المساحة المحلية لـ UIDragDetector ما لم يتم تعريف ReferenceUIInstance، وفي هذه الحالة يتم تعريف المحور في المساحة المحلية لذلك المثيل.(1, 0)

الاستجابة للحركة

تحدد خاصية UIDragDetector.ResponseStyle كيفية تغيير قيمة موضع الكائن بواسطة الحركة المقترحة. تتيح لك أنماط الاستجابة المخصصة استخدام قيم UIDragDetector.DragUDim2 وUIDragDetector.DragRotation الناتجة بالطريقة التي تريدها، دون أن يقوم الوالد للموصل بتنفيذ الحركة المقترحة.

الإعدادالوصف
Offsetالتحرك بواسطة قيم Offset لموضع GuiObject للمكون الرئيسي للموصل. هذا هو الإعداد الافتراضي.
Scaleالتحرك بواسطة قيم Scale لموضع GuiObject للمكون الرئيسي للموصل.
CustomOffsetلن يتحرك عنصر واجهة المستخدم على الإطلاق، لكن قيم Offset للموصل DragUDim2 ستظل محدثة وستظل أحداث الموصل تعمل، مما يتيح لك الاستجابة لتلاعب السحب بالطريقة التي تريدها.
CustomScaleلن يتحرك عنصر واجهة المستخدم على الإطلاق، لكن قيم Scale للموصل DragUDim2 ستظل محدثة وستظل أحداث الموصل تعمل، مما يتيح لك الاستجابة لتلاعب السحب بالطريقة التي تريدها.

حدود الترجمة والدوران

بشكل افتراضي، لا توجد حدود للحركة الثنائية الأبعاد خلف القيود الداخلية لـ DragStyle. يمكن الإعلان عن حدود الترجمات والدورات الدنيا والعليا باستخدام الخصائص التالية إذا رغبت في ذلك. بالإضافة إلى ذلك، يمكنك تحديد كيفية تقيد الكائن المسحوب ضمن حدود GuiObject معينة مثل Frame.

الخصائصالوصفالقيمة الافتراضية
MinDragTranslation
MaxDragTranslation
قيود لترجمة السحب في كل بعد، يتم تعريفها بواسطة قيمة UDim2. إذا كانت MaxDragTranslation أكبر من MinDragTranslation، سيتم قيد الترجمة ضمن تلك النطاق.{0, 0}, {0, 0}
MinDragAngle
MaxDragAngle
ذات صلة فقط إذا تم تعيين DragStyle إلى Enum.UIDragDetectorDragStyle.Rotate، أو إذا كانت الوظائف التي تم تعيينها من خلال SetDragStyleFunction() أو AddConstraintFunction() تحدد قيمة دوران. إذا كانت MaxDragAngle أعلى من MinDragAngle، سيتم قيد الدوران ضمن تلك النطاق.0
BoundingBehaviorتحدد سلوك حدود مثيل UIDragDetector عندما تكون BoundingUI تم تعيينها. إذا تم تعيين هذا إلى EntireObject، يتم قيد واجهة المستخدم بالكامل التي يتم سحبها ضمن BoundingUI، بينما إذا تم تعيينه على HitPoint، يتم قيد واجهة المستخدم التي تتم سحبها فقط بواسطة نقطة النقر/السحب الدقيقة وموقعها بعد الترجمة/الدوران. كراحة، فإن القيمة الافتراضية لـ Automatic تحاكي سلوك EntireObject لكائن واجهة مستخدم محاط بالكامل بـ BoundingUI، أو HitPoint لكائن واجهة مستخدم جزئياً خارج BoundingUI.Automatic

تعديلات السرعة

من خلال SelectionModeDragSpeed وSelectionModeRotateSpeed، يمكنك ضبط السرعات القصوى للسحب/الدوران للموصل. علاوة على ذلك، من خلال UIDragSpeedAxisMapping، يمكنك ضبط سرعات سحب الأبعاد X/Y بدلاً من الاعتماد على SelectionModeDragSpeed للموصل.

الخاصيةالوصف
SelectionModeDragSpeedتحدد السرعة القصوى للسحب للترجمة كمزيج من Scale وOffset لأقرب سلف لـ ScreenGui أو SurfaceGui التي ينتمي إليها UIDragDetector.
SelectionModeRotateSpeedتحدد الزاوية القصوى في الثانية التي يمكن أن يدور بها UIDragDetector.
UIDragSpeedAxisMappingتحدد سرعات سحب الأبعاد X/Y، بناءً على SelectionModeDragSpeed. القيمة الافتراضية هي XY، مما يعني أن سرعات المحورين X وY تستند إلى قيم Scale/Offset لـ X وY على التوالي.

يمكن أن تكون البدائل XX وYY، مما يعني أن كل من سرعات المحورين X وY تعتمد على المحور X (XX) أو المحور Y (YY) لقيم Scale، بينما تبقى قيم Offset تنطبق على محاورها الخاصة. على سبيل المثال، إذا كان أقرب سلف لـ ScreenGui محيطه 800×600 وSelectionModeDragSpeed هو {0.1, 10}, {0.1, 20}، فإن إعداد XX ينتج سرعة سحب X/Y تبلغ 80+10/80+20، بينما ينتج YY 60+10/60+20 (لاحظ أن قيم Offset تبقى كما هي في كلتا الحالتين).

استجابة السكربت للضغط والسحب

من خلال إشارات الأحداث، وتغييرات الخصائص، وScriptable نمط السحب، والوظائف المخصصة، يمكن للبرامج النصية الاستجابة لتلاعب عناصر واجهة المستخدم المسحوبة لتوجيه إعدادات مختلفة أو اتخاذ قرارات منطقية، مثل المنزلقات التي تضبط صوت الموسيقى وتأثيرات الصوت بشكل منفصل.

إشارات الأحداث

من خلال إشارات الأحداث التالية، يمكنك اكتشاف متى يبدأ المستخدم في سحب كائن، ويواصل، وينهي سحبه.

الحدثالوصف
DragStartيعمل عند بدء المستخدم سحب الكائن.
DragContinueيعمل عندما يواصل المستخدم سحب الكائن بعد أن تم بدء DragStart.
DragEndيعمل عندما يتوقف المستخدم عن سحب الكائن.

تحدد المنزلة التالية حاوياتها كـ BoundingUI لتقييد حركتها ضمن منطقة الحاوية، مما يسمح بسحب TranslateLine القائم على المقياس ليقتصر على العرض الكامل للحاوية دون الحاجة إلى برمجة إضافية.

UIDragDetector - تغيير شفافية إشارات الحدث

-- الهيكل هو SliderContainer ⟩ Handle ⟩ UIDragDetector ⟩ (هذا السكربت)
local sliderContainer = script.Parent.Parent.Parent
local handle = sliderContainer:FindFirstChild("Handle")
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- تعيين السحب بناءً على المقياس
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.TranslateLine -- يقيد السحب إلى خط
uiDragDetector.BoundingUI = sliderContainer
-- تعيين الشفافية الأولية للحاوية إلى قيمة المقياس X للمقبض
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
-- توسيع حدود المقبض للإشارة إلى بدء السحب
uiDragDetector.DragStart:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 6
end)
-- تغيير الشفافية حسب مقدار السحب في المقياس
uiDragDetector.DragContinue:Connect(function(inputPosition)
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
end)
-- إرجاع حدود المقبض للإشارة إلى انتهاء السحب
uiDragDetector.DragEnd:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 4
end)

تغييرات الموضع والدوران

بالإضافة إلى إشارات الأحداث، يمكنك مراقبة التغييرات في DragUDim2 و/أو DragRotation الخاصة بالموصل مباشرة.

يمتلك الموصل التالي DragStyle المعين إلى Rotate، مما يسمح للمستخدمين بسحب المقبض حول حلقة تدوير اللون، مع اكتشاف التغييرات في دوران السحب عبر Instance:GetPropertyChangedSignal().

UIDragDetector - تغيير DragRotation

local handle = script.Parent.Parent -- عنصر واجهة المستخدم للسحب
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.Rotate -- تعيين نمط السحب إلى الدوران
local function changeHue()
local currAngle = (math.fmod(handle.Rotation, 360)) / 360
if currAngle < 0 then
currAngle += 1
end
handle.BackgroundColor3 = Color3.fromHSV(currAngle, 1, 1)
end
-- تعيين اللون الأولي بناءً على دوران المقبض
changeHue()
-- توصيل الوظيفة إلى GetPropertyChangedSignal() للدوران المجرّد للموصل
uiDragDetector:GetPropertyChangedSignal("DragRotation"):Connect(changeHue)

نمط السحب المبرمج

إذا قمت بتعيين UIDragDetector.DragStyle للموصل إلى Enum.UIDragDetectorDragStyle.Scriptable، يمكنك توفير وظيفتك الخاصة التي تأخذ في اعتبارها Vector2 لموضع الإدخال وتعيد UDim2 (الموضع) و float (الدوران). سيقوم الموصل بتحديث الكائن إلى الموضع/الدوران المحسوب بناءً على القيم المرتجعة، وخصائص DragSpace وDragRelativity.

بشكل افتراضي، ستكون UDim2 و float المرتجع هو الموضع/الدوران المرغوب النهائي في المساحة المحلية للموصل. ستظل القيود الحالية للترجمة/الدوران سارية، كما هي القيود الحدية المفروضة بواسطة مثيل BoundingUI المعين.

المثال التالي يسحب عنصر واجهة مستخدم يتبع موجة جيبية محسوبة بواسطة التغير في إحداثيات X المدخلة. لاحظ أن DragSpace للموصل تم تعيينه إلى Enum.UIDragDetectorDragSpace.Relative.

UIDragDetector - سحب يتبع موجة جيبية

local frame = script.Parent -- عنصر واجهة المستخدم للسحب
local uiDragDetector = frame:FindFirstChildWhichIsA("UIDragDetector")
local initialXValue = 0
local maxHeightChange = 200
local pixelsPerRadian = 75 -- قم بتقليل هذه القيمة لزيادة التردد
uiDragDetector.DragStart:Connect(function(inputPosition)
initialXValue = inputPosition.X
end)
local function computeSinWaveCoordinate(inputPosition)
local deltaX = inputPosition.X - initialXValue
-- تغيير Y سالب بحيث "يتجه لأعلى" على الشاشة مع التغيير الإيجابي في Y
local deltaY = -math.sin(deltaX / pixelsPerRadian) * maxHeightChange
return UDim2.fromOffset(deltaX, deltaY)
end
uiDragDetector:SetDragStyleFunction(computeSinWaveCoordinate)

وظيفة القيد المخصصة

لا تحتوي UIDragDetectors على قواعد حركة مدمجة حول الشبكات والانزلاق، لكن يمكنك تسجيل وظائف قيد مخصصة لتعديل UIDragDetector.DragUDim2 وUIDragDetector.DragRotation قبل تطبيقها. على سبيل المثال، يمكنك الحفاظ على الحركة ضمن شبكة عن طريق تقريب المواضع إلى زيادات محددة، أو تحديد المناطق المسموح بها للحركة. لاحظ أن هذا يتم تطبيقه قبل أي قيود سابقة للترجمة/الدوران.

المثال التالي يستخدم وظيفة قيد تقيد السحب السطحي ضمن شبكة X/Y بناءً على عدد الصفوف والأعمدة. لاحظ أن ResponseStyle للموصل تم تعيينه إلى Enum.UIDragDetectorResponseStyle.Scale وBoundingUI تم تعيينه إلى حاوية الشبكة.

UIDragDetector - سحب في الشبكة، الانزلاق إلى البلاط

-- الهيكل هو GridContainer ⟩ Handle ⟩ UIDragDetector ⟩ (هذا السكربت)
local gridContainer = script.Parent.Parent.Parent
local handle = gridContainer:FindFirstChild("Handle") -- عنصر واجهة المستخدم للسحب
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- تعيين السحب بناءً على المقياس
uiDragDetector.DragRelativity = Enum.UIDragDetectorDragRelativity.Relative
uiDragDetector.BoundingUI = gridContainer
local NUM_COLUMNS = 10
local NUM_ROWS = 5
local xScaleIncrement = 1 / NUM_COLUMNS
local yScaleIncrement = 1 / NUM_ROWS
local initialParentPosition = uiDragDetector.Parent.Position
uiDragDetector.DragStart:Connect(function()
initialParentPosition = uiDragDetector.Parent.Position
end)
local function dragToGridOnly(proposedPosition, proposedRotation)
local griddedXScale = math.round(proposedPosition.X.Scale / xScaleIncrement) * xScaleIncrement
local griddedYScale = math.round(proposedPosition.Y.Scale / yScaleIncrement) * yScaleIncrement
return UDim2.fromScale(griddedXScale, griddedYScale), proposedRotation
end
uiDragDetector:AddConstraintFunction(1, dragToGridOnly)
©2026 شركة Roblox Corporation. تُعد منصّة Roblox، وشعار Roblox وشعار "توسيع حدود المخيلة"، من ضمن علاماتنا التجارية المسجّلة وغير المسجّلة في الولايات المتحدة وبلدان أخرى.