في الرسوم المتحركة، التويين هو عملية توليد الإطارات الوسيطة بين نقطتين رئيسيتين في تسلسل. عند تصميم واجهة المستخدم، يمكنك استخدام التويين للانتقال من GuiObject بسلاسة من حالة إلى أخرى، مثل:
- زيادة حجم زر بسلاسة عند اختيار المستخدم له.
- انزلاق قوائم واجهة المستخدم إلى داخل وخارج حواف الشاشة.
- تحريك شريط الصحة تدريجيًا بين عرضين عندما يتلقى المستخدم دفعة صحة.
توين خاصية واحدة
الوضع
لتويين الوضع لـ GuiObject:
- قم بضبط AnchorPoint للكائن.
- مرر TweenInfo والموقع المستهدف إلى TweenService:Create().
- قم بتشغيل التويين باستخدام Tween:Play().
يضع مقتطف الشيفرة التالي ImageLabel داخل ScreenGui في المركز الدقيق للشاشة:
UI Tween - Positionlocal TweenService = game:GetService("TweenService")local Players = game:GetService("Players")local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")local ScreenGui = PlayerGui:WaitForChild("ScreenGui")local object = ScreenGui:WaitForChild("ImageLabel")object.AnchorPoint = Vector2.new(0.5, 0.5)local targetPosition = UDim2.new(0.5, 0, 0.5, 0)local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {Position = targetPosition})tween:Play()
الحجم
لتويين الحجم لـ GuiObject:
- قم بإرفاق UIAspectRatioConstraint بالكائن للحفاظ على نسبة العرض إلى الارتفاع المصممة عند التويين.
- مرر TweenInfo والحجم المستهدف إلى TweenService:Create().
- قم بتشغيل التويين باستخدام Tween:Play().
يضع مقتطف الشيفرة التالي ImageLabel داخل ScreenGui بحيث يشغل 40% من عرض أو ارتفاع الشاشة (أيها أصغر) من نقطة ارتكاز الكائن في المنتصف:
UI Tween - Sizelocal TweenService = game:GetService("TweenService")local Players = game:GetService("Players")local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")local ScreenGui = PlayerGui:WaitForChild("ScreenGui")local object = ScreenGui:WaitForChild("ImageLabel")object.AnchorPoint = Vector2.new(0.5, 0.5)local aspectRatioConstraint = Instance.new("UIAspectRatioConstraint")aspectRatioConstraint.Parent = objectlocal targetSize = UDim2.new(0.4, 0, 0.4, 0)local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {Size = targetSize})tween:Play()
الدوران
لتويين الدوران لـ GuiObject:
- قم بضبط AnchorPoint للكائن للدوران حوله.
- حدد Rotation المستهدف للكائن.
- مرر TweenInfo والدوران المستهدف إلى TweenService:Create().
- قم بتشغيل التويين باستخدام Tween:Play().
UI Tween - Sizelocal TweenService = game:GetService("TweenService")local Players = game:GetService("Players")local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")local ScreenGui = PlayerGui:WaitForChild("ScreenGui")local object = ScreenGui:WaitForChild("ImageLabel")object.AnchorPoint = Vector2.new(0.5, 0.5)local targetRotation = 45local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {Rotation = targetRotation})tween:Play()
الشفافية
تتحكم خصائص متعددة في شفافية واجهة المستخدم، اعتمادًا على نوع الكائن. يمكنك توين كل من هذه الخصائص بشكل فردي أو مجتمعة من خلال تويين متعدد الخصائص. بدلاً من ذلك، يمكنك توين الشفافية العامة لكائن عن طريق وضعه داخل CanvasGroup وتويين GroupTransparency للمجموعة.
UI Tween - Image Transparencylocal TweenService = game:GetService("TweenService")local Players = game:GetService("Players")local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")local ScreenGui = PlayerGui:WaitForChild("ScreenGui")local object = ScreenGui:WaitForChild("ImageLabel")local targetTransparency = 0.8local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {ImageTransparency = targetTransparency})tween:Play()
UI Tween - Canvas Group Transparencylocal TweenService = game:GetService("TweenService")local Players = game:GetService("Players")local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")local ScreenGui = PlayerGui:WaitForChild("ScreenGui")local canvasGroup = ScreenGui:WaitForChild("CanvasGroup")local targetTransparency = 0.8local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(canvasGroup, tweenInfo, {GroupTransparency = targetTransparency})tween:Play()
اللون
تتحكم خصائص متعددة في لون واجهة المستخدم، اعتمادًا على نوع الكائن. يمكنك توين كل من هذه الخصائص بشكل فردي أو مجتمعة من خلال تويين متعدد الخصائص. بدلاً من ذلك، يمكنك توين اللون العام لكائن عن طريق وضعه داخل CanvasGroup وتويين GroupColor3 للمجموعة.
UI Tween - Image Colorlocal TweenService = game:GetService("TweenService")local Players = game:GetService("Players")local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")local ScreenGui = PlayerGui:WaitForChild("ScreenGui")local object = ScreenGui:WaitForChild("ImageLabel")local targetColor = Color3.fromRGB(255, 0, 0)local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {ImageColor3 = targetColor})tween:Play()
UI Tween - Canvas Group Colorlocal TweenService = game:GetService("TweenService")local Players = game:GetService("Players")local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")local ScreenGui = PlayerGui:WaitForChild("ScreenGui")local canvasGroup = ScreenGui:WaitForChild("CanvasGroup")local targetColor = Color3.fromRGB(255, 0, 0)local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(canvasGroup, tweenInfo, {GroupColor3 = targetColor})tween:Play()
الحدود
تتحكم خصائص متعددة في حدود واجهة المستخدم، اعتمادًا على نوع الكائن.
بدلاً من ذلك، يمكنك تطبيق كائن UIStroke الطفل وتويين سمكه، لونه، و/أو شفافيته.
| كائن واجهة المستخدم | الخصائص |
|---|---|
| UIStroke | Color, Thickness, Transparency |
UI Tween - UIStroke Color & Thicknesslocal TweenService = game:GetService("TweenService")local Players = game:GetService("Players")local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")local ScreenGui = PlayerGui:WaitForChild("ScreenGui")local object = ScreenGui:WaitForChild("TextLabel")local stroke = Instance.new("UIStroke")stroke.Color = Color3.fromRGB(255, 255, 255)stroke.Thickness = 5stroke.Parent = objectlocal targetColor = Color3.fromRGB(255, 0, 0)local targetThickness = 10local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(stroke, tweenInfo, {Color = targetColor, Thickness = targetThickness})tween:Play()
توين متعدد الخصائص
يمكنك دمج أي من تويينات الخاصية الواحدة في توينات أكثر تعقيدًا عن طريق تمرير العديد من الخصائص المستهدفة إلى TweenService:Create(), على سبيل المثال الوضع + الدوران أو الحجم + الشفافية.
UI Tween - Position & Rotationlocal TweenService = game:GetService("TweenService")local Players = game:GetService("Players")local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")local ScreenGui = PlayerGui:WaitForChild("ScreenGui")local object = ScreenGui:WaitForChild("ImageLabel")object.AnchorPoint = Vector2.new(0.5, 0.5)local targetPosition = UDim2.new(0.5, 0, 0.5, 0)local targetRotation = 45local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {Position = targetPosition, Rotation = targetRotation})tween:Play()
UI Tween - Size & Transparencylocal TweenService = game:GetService("TweenService")local Players = game:GetService("Players")local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")local ScreenGui = PlayerGui:WaitForChild("ScreenGui")local object = ScreenGui:WaitForChild("ImageLabel")object.AnchorPoint = Vector2.new(0.5, 0.5)local aspectRatioConstraint = Instance.new("UIAspectRatioConstraint")aspectRatioConstraint.Parent = objectlocal targetSize = UDim2.new(0.4, 0, 0.4, 0)local targetTransparency = 0.8local tweenInfo = TweenInfo.new(2)local tween = TweenService:Create(object, tweenInfo, {Size = targetSize, ImageTransparency = targetTransparency})tween:Play()
تسلسلات التويين
يمكنك ربط الرسوم المتحركة لواجهة المستخدم لتحدث واحدة تلو الأخرى عن طريق تشغيل التويينات اللاحقة عند حدث Completed للتويين السابق. على سبيل المثال، تقوم الشيفرة التالية بتحريك كائن إلى مركز الشاشة، ثم تدور بمقدار 45 درجة.
UI Tween Sequence
local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = PlayerGui:WaitForChild("ScreenGui")
local object = ScreenGui:WaitForChild("ImageLabel")
object.AnchorPoint = Vector2.new(0.5, 0.5)
local targetPosition = UDim2.new(0.5, 0, 0.5, 0)
local targetRotation = 45
local tweenInfo = TweenInfo.new(2)
local positionTween = TweenService:Create(object, tweenInfo, {Position = targetPosition})
local rotationTween = TweenService:Create(object, tweenInfo, {Rotation = targetRotation})
-- بداية تشغيل التويين الخاص بالموقع
positionTween:Play()
-- تشغيل التويين الخاص بالدوران عند الانتهاء من التويين الخاص بالموقع
positionTween.Completed:Connect(function()
rotationTween:Play()
end)
انتقالات التصميم
يمكن أيضًا تحريك كائنات واجهة المستخدم من خلال انتقالات التصميم، والتي تشبه انتقالات CSS، حيث يتم توين خاصية أو أكثر من واجهة المستخدم من خلال تعريفات StyleRule. راجع دليل محرر الأنماط لمزيد من التفاصيل.

خيارات التسهيل
باستخدام خيارات التسهيل في TweenInfo، يمكنك التحكم في أسلوب واتجاه التسهيل للرسوم المتحركة لواجهة المستخدم.
الأسلوب
يحدد Enum.EasingStyle معدل التداخل من البداية إلى النهاية. بشكل افتراضي، يتم تعيين أسلوب التسهيل إلى Enum.EasingStyle.Quad.
| الأسلوب | الوصف |
|---|---|
| خطّي | يتحرك بسرعة ثابتة. |
| جيب | تحدد السرعة بواسطة موجة جيب للحصول على حركة تسهيل لطيفة. |
| ربع | مشابه لـ جيب ولكن مع منحنى أكثر حدة يعتمد على التداخل التربيعي. |
| مكعب | مشابه لـ ربع ولكن مع منحنى أكثر حدة يعتمد على التداخل المكعب. |
| ربع | مشابه لـ مكعب ولكن مع منحنى أكثر حدة يعتمد على التداخل الرباعي. |
| خماسي | مشابه لـ ربع ولكن مع منحنى أكثر حدة يعتمد على التداخل الخماسي. |
| أسّي | أكثر منحنى حدة يعتمد على التداخل الأسّي. |
| دایرّي | يتبع قوسًا دائريًا، بحيث تكون التسارع أكثر فجائية والتباطؤ أكثر تدريجياً مقارنةً بـ خماسي أو أسّي. |
| عودة | يتجاوز الهدف قليلاً ثم يعود إلى مكانه. |
| ارتداد | ترتد إلى الوراء عدة مرات بعد الوصول إلى الهدف، قبل الاستقرار في النهاية. |
| مرن | يتحرك كما لو كان متصلاً بحبل مطاطي، متجاوزًا الهدف عدة مرات. |

Easing Style - Cubiclocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic)local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
الاتجاه
يحدد Enum.EasingDirection كيفية تطبيق أسلوب التسهيل على كائن، مع تعيين افتراضي هو خارجي. لاحظ أن التويين بأسلوب تسهيل خطّي لا يتأثر، حيث أن التداخل الخطي ثابت من البداية إلى النهاية.
| الاتجاه | الوصف |
|---|---|
| في | يطبق أسلوب التسهيل في اتجاه للأمام. |
| خارج | يطبق أسلوب التسهيل في اتجاه معكوس. |
| في وخارج | يطبق أسلوب التسهيل للأمام للنصف الأول وفي الاتجاه المعاكس للنصف الثاني. |
Easing direction - InOutlocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})
تأثير كاتبة على النص
يمكنك بسهولة تعزيز واجهة المستخدم المعتمدة على النصوص، مثل لافتات المشاهد، وتعليمات اللاعبين، والتنبيهات، مع تأثيرات متحركة. تأثير "كاتبة" مثالي لـ TextLabels التي تحكي قصة، أو تخرج محادثات الشخصيات غير القابلة للعب، وما إلى ذلك.
قم بإنشاء ModuleScript جديدة داخل ReplicatedStorage.
أعد تسمية البرنامج النصي الجديد إلى AnimateUI.

الصق الكود التالي في البرنامج النصي:
ModuleScript - AnimateUIlocal LocalizationService = game:GetService("LocalizationService")local Players = game:GetService("Players")local SOURCE_LOCALE = "en"local translator = nillocal AnimateUI = {}function AnimateUI.loadTranslator()pcall(function()translator = LocalizationService:GetTranslatorForPlayerAsync(Players.LocalPlayer)end)if not translator thenpcall(function()translator = LocalizationService:GetTranslatorForLocaleAsync(SOURCE_LOCALE)end)endendfunction AnimateUI.typeWrite(guiObject, text, delayBetweenChars)guiObject.Visible = trueguiObject.AutoLocalize = falselocal displayText = text-- ترجم النص إذا كان ذلك ممكنًاif translator thendisplayText = translator:Translate(guiObject, text)end-- استبدال علامات التفريغ بحيث لا تفوت حلقة الجرافيم تلك الرموزdisplayText = displayText:gsub("<br%s*/>", "\n")-- إزالة علامات RichText لأن الرسوم المتحركة حرف بحرف ستكسر العلاماتdisplayText = displayText:gsub("<[^<>]->", "")-- تعيين النص المترجم/المعدّل على الوالدguiObject.Text = displayTextlocal index = 0for first, last in utf8.graphemes(displayText) doindex += 1guiObject.MaxVisibleGraphemes = indextask.wait(delayBetweenChars)endendreturn AnimateUIأنشئ TextLabel في موقع مناسب، مثل داخل ScreenGui المتصلة بـ StarterGui.
أدخل برنامج LocalScript جديدة كطفل مباشر للتسمية والصق الكود التالي. لاحظ أن كل رسالة يتم إخراجها عن طريق استدعاء AnimateUI.typeWrite() مع معلمات لكائن الوالد، السلسلة التي يجب إخراجها، والفترة ما بين الأحرف.
LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local AnimateUI = require(ReplicatedStorage:WaitForChild("AnimateUI"))local label = script.Parent-- تحميل مترجم إذا كانت التجربة محدثة--AnimateUI.loadTranslator()local message1 = [[خلف هذا الباب هو <br /><font size="46" color="rgb(255,50,25)">زيلغوث العظيم...</font> <font size="40">🗡</font>]]AnimateUI.typeWrite(label, message1, 0.05)task.wait(1)local message2 = [[...من يحكم هذا الزنزانة <font color="rgb(255,200,50)">دون تحدي!</font> <font size="30">😈</font>]]AnimateUI.typeWrite(label, message2, 0.05)