เราต้องการเพิ่ม UI แผนที่แบบโต้ตอบเพื่อให้ผู้ใช้สามารถบริโภคข้อมูลในสถานีอวกาศที่ดูและรู้สึกเหมือนมันมีชีวิตอยู่ในโลกนี้ เราตัดสินใจที่จะสร้างแผนที่ภายในพื้นที่ 3D แทนการแสดงบนหน้าจอที่ปกคลุมประสบการณ์ การแสดงผลที่เป็นภาพแบบนี้ช่วยให้มีความเข้าใจและ immersive กับโลกมากขึ้น แทนที่จะรู้สึกเหมือนมันเป็นประสบการณ์ที่แยกต่างหาก
ออกแบบแผนที่
ในการออกแบบแผนที่:
เราได้จำลอง UI ในแอปพลิเคชันภายนอกและคิดขึ้นแนวคิดเบื้องต้นเกี่ยวกับสิ่งที่เราต้องการให้มันดูเป็นอย่างไร

เราได้ส่งออกชิ้นส่วนเฉพาะของแผนที่เป็น .png และนำเข้าสู่ Studio

สร้างแผนที่
การสร้างแผนที่ภายใน Studio เกี่ยวข้องกับการใช้ Parts และ SurfaceGuis.
สำหรับองค์ประกอบที่ไม่โต้ตอบ เราสามารถแค่เพิ่มวัตถุ SurfaceGui ลงในส่วน
สำหรับองค์ประกอบที่โต้ตอบ SurfaceGui ยังต้องอยู่ภายในภาชนะ StarterGui โดยที่คุณสมบัติ Adornee เชื่อมโยงกับชิ้นส่วนที่เหมาะสมในพื้นที่ 3D ทำให้คุณสามารถเพิ่มเหตุการณ์ปุ่ม
เพื่อให้ได้เอฟเฟกต์พาราลแลกซ์ เราได้ใช้ ScreenGui สามชุดที่กำหนดให้กับ Parts สามตัวที่มีค่า X ที่แตกต่างกัน

จากนั้นเราก็ได้เพิ่มเอฟเฟกต์การเรืองแสงด้วยคุณสมบัติ SurfaceGui.LightInfluence หากคุณตั้งค่าค่าของคุณสมบัติน้อยกว่า 1 มันจะเปิดใช้งานคุณสมบัติ SurfaceGui.Brightness โดยการปรับความสว่าง คุณสามารถเพิ่มการเรืองแสงที่ออกมาจากภาพ
เพื่อให้ผู้ใช้สามารถสลับการแสดงแผนที่ เราได้ใช้ ProximityPrompt ที่เราเชื่อมโยงไปยังโมเดล 3D นี่เป็นวิธีที่ง่ายในการอนุญาตให้ผู้ใช้มีปฏิสัมพันธ์กับองค์ประกอบในโลก

สุดท้าย โดยการใช้ UITweenModule ModuleScript ภายใน ReplicatedStorage เราได้สร้างอนิเมชันสำหรับการซ่อนและแสดง UI โดยใช้ TweenService และตรรกะเล็กน้อยในการกำหนดสถานะ โดยการติดตามสิ่งที่ผู้ใช้คลิก เราสามารถซ่อนและแสดงองค์ประกอบโดยการเปลี่ยนคุณสมบัติต่างๆ เช่น อัลฟา ตำแหน่ง และขนาด
UITweenModule ModuleScriptlocal TweenService = game:GetService("TweenService")local UITween = {}-- สำหรับการทำให้ภาพจางลงfunction UITween.fadePart(object, amount, time, delay)local tweenAlpha = TweenInfo.new(time, --เวลาEnum.EasingStyle.Quad, --EasingStyleEnum.EasingDirection.Out, --EasingDirection0, --จำนวนการทำซ้ำ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, --EasingStyleEnum.EasingDirection.Out, --EasingDirection0, --จำนวนการทำซ้ำ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, --EasingStyleEnum.EasingDirection.Out, --EasingDirection0, --จำนวนการทำซ้ำ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, --EasingStyleEnum.EasingDirection.Out, --EasingDirection0, --จำนวนการทำซ้ำ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, --EasingStyleEnum.EasingDirection.Out, --EasingDirection0, --จำนวนการทำซ้ำ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, --EasingStyleEnum.EasingDirection.Out, --EasingDirection0, --จำนวนการทำซ้ำ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การใช้ UI Tween กับวัตถุlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- เพิ่ม UITween Modulelocal UITween = require(ReplicatedStorage.UITweenModule)-- หา Guis ของผู้เล่นและวัตถุ UIlocal playerGui = game:GetService('Players').LocalPlayer:WaitForChild('PlayerGui')local screenGuiMapUIFrame = playerGui:WaitForChild("ScreenGuiMapUIFrame").SurfaceGuilocal mapUIFrameStroke = screenGuiMapUIFrame.FrameStrokelocal mapUIFrameFill = screenGuiMapUIFrame.FrameFill-- ขนาดที่ใช้ในการ tweenlocal frameSizeStart = UDim2.new(0, 0, 0, 0)local frameSizeMid = UDim2.new(1, 0, 0.05, 0)local frameSizeEnd = UDim2.new(1, 0, 1, 0)-- ตัวอย่างการ TweenUITween.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)
นี่คือผลลัพธ์สุดท้ายของแผนที่แบบโต้ตอบ: