لقد أردنا إضافة واجهة خريطة تفاعلية للسماح للمستخدمين بتناول المعلومات في محطة الفضاء التي بدت وكأنها تعيش في هذا العالم. قررنا بناء الخريطة داخل الفضاء ثلاثي الأبعاد بدلاً من أن تكون على شاشة تتداخل مع التجربة. هذا النوع من التصور الديجيتالي يسمح بقدر أكبر من الانغماس في العالم بدلاً من الشعور بأنها تجربة منفصلة تمامًا.
تصميم الخريطة
لتصميم الخريطة:
قمنا بإنشاء نموذج واجهة المستخدم في تطبيق خارجي وخرجنا بفكرة عامة عن كيفية رغبتنا في أن تبدو.

قمنا بتصدير القطع الفردية من الخريطة كـ .png واستيرادها إلى الاستوديو.

بناء الخريطة
تتطلب عملية بناء الخريطة داخل الاستوديو استخدام Parts و SurfaceGuis.
بالنسبة للعناصر غير التفاعلية، كل ما احتجنا فعله هو إضافة كائن SurfaceGui إلى الجزء.
بالنسبة للعناصر التفاعلية، يجب أيضًا أن يكون SurfaceGui داخل الحاوية StarterGui، مع ربط خاصية Adornee بالجزء المناسب في مساحة العمل ثلاثية الأبعاد. يؤدي ذلك إلى تمكينك من إضافة أحداث الأزرار.
لتحقيق تأثير البارالاكس، استخدمنا ثلاث حالات منفصلة من ScreenGui مرتبطة بثلاثة أجزاء فريدة ذات قيم X مختلفة.

ثم أضفنا تأثير التوهج باستخدام خاصية SurfaceGui.LightInfluence. إذا قمت بتعيين قيمة الخاصية لأقل من 1، فإن ذلك يعزز خاصية SurfaceGui.Brightness. من خلال تعديل السطوع، يمكنك زيادة التوهج المنبعث من الصورة.
للسماح للمستخدمين بالتبديل بين عرض الخريطة، استخدمنا ProximityPrompt الذي قمنا بتوصيله بنموذج ثلاثي الأبعاد. هذه طريقة سهلة للسماح بالتفاعل مع عناصر العالم.

أخيرًا، باستخدام وحدة UITweenModule ModuleScript داخل ReplicatedStorage، قمنا بتحريك إخفاء وعرض واجهة المستخدم باستخدام TweenService وقليل من المنطق لتحديد الحالة. من خلال تتبع ما نقر عليه المستخدم، استطعنا إخفاء وعرض العناصر من خلال تحريك خصائص مختلفة مثل الشفافية، والموضع، والحجم.
UITweenModule ModuleScriptlocal TweenService = game:GetService("TweenService")local UITween = {}-- لتلاشي الصورfunction UITween.fadePart(object, amount, time, delay)local tweenAlpha = TweenInfo.new(time, -- الزمنEnum.EasingStyle.Quad, -- أسلوب التخفيفEnum.EasingDirection.Out, -- اتجاه التخفيف0, -- عدد التكرارfalse, -- بالعكس إذا كان صحيحًاdelay -- زمن التأخير)local tween = TweenService:Create(object, tweenAlpha, {Transparency = amount})tween:Play()endfunction UITween.fade(object, amount, time, delay)local tweenAlpha = TweenInfo.new(time, -- الزمنEnum.EasingStyle.Quad, -- أسلوب التخفيفEnum.EasingDirection.Out, -- اتجاه التخفيف0, -- عدد التكرارfalse, -- بالعكس إذا كان صحيحًاdelay -- زمن التأخير)local tween = TweenService:Create(object, tweenAlpha, {ImageTransparency = amount})tween:Play()end-- لتلاشي الخلفياتfunction UITween.fadeBackground(object, amount, time, delay)local tweenAlpha = TweenInfo.new(time, -- الزمنEnum.EasingStyle.Quad, -- أسلوب التخفيفEnum.EasingDirection.Out, -- اتجاه التخفيف0, -- عدد التكرارfalse, -- بالعكس إذا كان صحيحًاdelay -- زمن التأخير)local tween = TweenService:Create(object, tweenAlpha, {BackgroundTransparency = amount})tween:Play()end-- لتلاشي النصوصfunction UITween.fadeText(object, amount, time, delay)local tweenAlpha = TweenInfo.new(time, -- الزمنEnum.EasingStyle.Quad, -- أسلوب التخفيفEnum.EasingDirection.Out, -- اتجاه التخفيف0, -- عدد التكرارfalse, -- بالعكس إذا كان صحيحًاdelay -- زمن التأخير)local tween1 = TweenService:Create(object, tweenAlpha, {TextTransparency = amount})tween1:Play()end-- لتحريك النصوص والصورfunction UITween.move(object, position, time, delay)task.wait(delay)object:TweenPosition(position, Enum.EasingDirection.Out, Enum.EasingStyle.Quint, time)end-- لتغيير الحجمfunction UITween.size(object, size, time, delay, override, callback)local tweenSize = TweenInfo.new(time, -- الزمنEnum.EasingStyle.Quint, -- أسلوب التخفيفEnum.EasingDirection.Out, -- اتجاه التخفيف0, -- عدد التكرارfalse, -- بالعكس إذا كان صحيحًاdelay, -- زمن التأخيرoverride,callback)local tween = TweenService:Create(object, tweenSize, {Size = size})tween:Play()endfunction UITween.rotate(object, rotation, time, delay, override, callback)local tweenSize = TweenInfo.new(time, -- الزمنEnum.EasingStyle.Quint, -- أسلوب التخفيفEnum.EasingDirection.Out, -- اتجاه التخفيف0, -- عدد التكرارfalse, -- بالعكس إذا كان صحيحًاdelay, -- زمن التأخيرoverride,callback)local tween = TweenService:Create(object, tweenSize, {Rotation = rotation})tween:Play()end-- لتشويش كاميرا اللعبةfunction UITween.blur(object, amount, time)local tweenInfo = TweenInfo.new(time, Enum.EasingStyle.Linear, Enum.EasingDirection.Out, 0, false, 0)local tween = TweenService:Create(object, tweenInfo, {Size = amount})tween:Play()end-- لتشغيل الإضاءةfunction UITween.turnOn(object, amount, time)local tweenInfo = TweenInfo.new(time, Enum.EasingStyle.Linear, Enum.EasingDirection.Out, 0, false, 0)local tween = TweenService:Create(object, tweenInfo, {Brightness = amount})tween:Play()endreturn UITweenتطبيق مؤثرات واجهة المستخدم على الكائناتlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- إضافة وحدة UITweenlocal UITween = require(ReplicatedStorage.UITweenModule)-- العثور على واجهات اللاعب وكائنات واجهة المستخدمlocal playerGui = game:GetService('Players').LocalPlayer:WaitForChild('PlayerGui')local screenGuiMapUIFrame = playerGui:WaitForChild("ScreenGuiMapUIFrame").SurfaceGuilocal mapUIFrameStroke = screenGuiMapUIFrame.FrameStrokelocal mapUIFrameFill = screenGuiMapUIFrame.FrameFill-- الأحجام المستخدمة للتخفيتlocal frameSizeStart = UDim2.new(0, 0, 0, 0)local frameSizeMid = UDim2.new(1, 0, 0.05, 0)local frameSizeEnd = UDim2.new(1, 0, 1, 0)-- مثال للتخفيتUITween.fade(mapUIFrameStroke, 0, 2, 0)UITween.size(mapUIFrameStroke, frameSizeMid, 0.4, 0)UITween.fade(mapUIFrameFill, 0, 2, 0.5)UITween.size(mapUIFrameFill, frameSizeEnd, 0.4, 0.25)task.wait(0.25)UITween.size(mapUIFrameStroke, frameSizeMid, 0.4, 0)UITween.size(mapUIFrameFill, frameSizeMid, 0.4, 0.25)task.wait(0.25)UITween.size(mapUIFrameStroke, frameSizeEnd, 0.4, 0)UITween.size(mapUIFrameFill, frameSizeEnd, 0.4, 0.25)
إليك النتيجة النهائية للخريطة التفاعلية: