في الرسوم المتحركة، التويين هو عملية توليد إطارات وسيطة بين نقطتين رئيسيتين في تسلسل. عند تصميم واجهة المستخدم، يمكنك استخدام التويين للانتقال بـ GuiObject بسلاسة من حالة إلى أخرى، مثل:
- زيادة حجم الزر بسلاسة عندما يختاره المستخدم.
- انزلاق قوائم واجهة المستخدم إلى الداخل والخارج من حواف الشاشة.
- تحريك شريط الصحة تدريجياً بين عرضين عندما يحصل المستخدم على تعزيز للصحة.
التويينات ذات الخاصية الواحدة
الموضع
لتويين الموضع لـ GuiObject:
- قم بتعيين AnchorPoint للكائن.
- مرر TweenInfo وموضع الهدف إلى TweenService:Create().
- قم بتشغيل التويين باستخدام Tween:Play().
تقوم الشيفرة البرمجية التالية بنقل ImageLabel داخل ScreenGui إلى المركز الدقيق للشاشة:
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 tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(object, tweenInfo, {Position = targetPosition})
tween:Play()الحجم
لتويين الحجم لـ GuiObject:
- قم بإرفاق UIAspectRatioConstraint بالكائن للحفاظ على نسبة العرض إلى الارتفاع المصممة عند التويين.
- مرر TweenInfo وحجم الهدف إلى TweenService:Create().
- قم بتشغيل التويين باستخدام Tween:Play().
تقوم الشيفرة البرمجية التالية بتكبير ImageLabel داخل ScreenGui إلى 40% من عرض أو ارتفاع الشاشة (أيها كان أصغر) من نقطة الارتكاز المركزية للكائن:
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 aspectRatioConstraint = Instance.new("UIAspectRatioConstraint")
aspectRatioConstraint.Parent = object
local 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().
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 targetRotation = 45
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(object, tweenInfo, {Rotation = targetRotation})
tween:Play()الشفافية
تتحكم خصائص متعددة في شفافية واجهة المستخدم، اعتمادًا على نوع الكائن. يمكنك تويين كل من هذه الخصائص بشكل فردي أو مجتمعة من خلال تويين متعدد الخصائص. بدلاً من ذلك، يمكنك تويين الشفافية العامة لكائن عن طريق وضعه داخل CanvasGroup وتويين GroupTransparency للمجموعة.
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")
local targetTransparency = 0.8
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(object, tweenInfo, {ImageTransparency = targetTransparency})
tween:Play()local 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.8
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(canvasGroup, tweenInfo, {GroupTransparency = targetTransparency})
tween:Play()اللون
تتحكم خصائص متعددة في لون واجهة المستخدم، اعتمادًا على نوع الكائن. يمكنك تويين كل من هذه الخصائص بشكل فردي أو مجتمعة من خلال تويين متعدد الخصائص. بدلاً من ذلك، يمكنك تويين اللون العام لكائن عن طريق وضعه داخل CanvasGroup وتويين GroupColor3 للمجموعة.
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")
local targetColor = Color3.fromRGB(255, 0, 0)
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(object, tweenInfo, {ImageColor3 = targetColor})
tween:Play()local 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 |
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("TextLabel")
local stroke = Instance.new("UIStroke")
stroke.Color = Color3.fromRGB(255, 255, 255)
stroke.Thickness = 5
stroke.Parent = object
local targetColor = Color3.fromRGB(255, 0, 0)
local targetThickness = 10
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(stroke, tweenInfo, {Color = targetColor, Thickness = targetThickness})
tween:Play()التويينات متعددة الخصائص
يمكنك دمج أي من التويينات ذات الخصائص الواحدة في توينات أكثر تعقيدًا عن طريق تمرير خصائص هدف متعددة إلى TweenService:Create()، على سبيل المثال الموضع + الدوران أو الحجم + الشفافية.
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 tween = TweenService:Create(object, tweenInfo, {Position = targetPosition, Rotation = targetRotation})
tween:Play()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 aspectRatioConstraint = Instance.new("UIAspectRatioConstraint")
aspectRatioConstraint.Parent = object
local targetSize = UDim2.new(0.4, 0, 0.4, 0)
local targetTransparency = 0.8
local tweenInfo = TweenInfo.new(2)
local tween = TweenService:Create(object, tweenInfo, {Size = targetSize, ImageTransparency = targetTransparency})
tween:Play()تسلسلات التويين
يمكنك ربط الرسوم المتحركة لواجهة المستخدم لتحدث واحدة تلو الأخرى عن طريق تشغيل التويينات اللاحقة عند حدث Completed للتويين السابق. على سبيل المثال، تقوم الشيفرة التالية بنقل كائن إلى مركز الشاشة، ثم تدويره بمقدار 45°.
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.
| النمط | الوصف |
|---|---|
| خطّي | يتحرك بسرعة ثابتة. |
| جيب | تحدد السرعة بواسطة موجة جيب للحصول على حركة تخفيف لطيفة. |
| رباعي | مشابه لـ جيب ولكن مع منحنى أكثر حدة قليلاً يعتمد على التداخل الرباعي. |
| مكعب | مشابه لـ رباعي ولكن مع منحنى أكثر حدة قليلاً يعتمد على التداخل المكعب. |
| ربع | مشابه لـ مكعب ولكن مع منحنى أكثر حدة يعتمد على التداخل الرباعي. |
| خماسي | مشابه لـ ربع ولكن مع منحنى أكثر حدة يعتمد على التداخل الخماسي. |
| أسّي | أكثر منحنى حدة يعتمد على التداخل الأسّي. |
| دائري | يتبع قوس دائري، بحيث يكون التسارع أكثر فجائية والتباطؤ أكثر تدريجياً مقارنةً بـ خماسي أو أسّي. |
| عودة | يتجاوز الهدف قليلاً، ثم يعود إلى مكانه. |
| ارتداد | يرتد للخلف عدة مرات بعد الوصول إلى الهدف، قبل أن يستقر في النهاية. |
| مرن | يتحرك كما لو كان متصلاً بشريط مطاطي، متجاوزًا الهدف عدة مرات. |

local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic)
local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})الاتجاه
تحدد Enum.EasingDirection كيفية تطبيق نمط التخفيف على كائن، مع افتراض أن الاتجاه هو خارج. لاحظ أن التويين مع نمط تخفيف خطّي لا يتأثر، حيث أن التداخل الخطي ثابت من البداية إلى النهاية.
| الاتجاه | الوصف |
|---|---|
| داخل | يطبق نمط التخفيف في اتجاه للأمام. |
| خارج | يطبق نمط التخفيف في اتجاه عكسي. |
| داخل وخارج | يطبق نمط التخفيف للأمام في النصف الأول وعكسيًا في النصف الثاني. |
local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Cubic, Enum.EasingDirection.InOut)
local tween = TweenService:Create(object, tweenInfo, {Rotation = 45})تأثير كاتب على النص
يمكنك بسهولة تعزيز واجهة المستخدم المعتمدة على النص، مثل لافتات المشاهد، وتعليمات اللاعبين، والمطالبات، مع تأثيرات متحركة. تأثير "كاتب" مثالي لـ TextLabels التي تروي قصة، أو تخرج محادثات NPC، وما إلى ذلك.
أنشئ 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)