我們想要添加一個互動地圖 UI,讓使用者能在太空站中以一種看起來像是生活在這個世界中的方式來消耗資訊。我們決定在 3D 空間中建立地圖,而不是在覆蓋體驗的螢幕上。這種自叙式的視覺化讓玩家能更加沉浸於這個世界,而不是感覺這是一種完全獨立的體驗。
設計地圖
要設計地圖:
我們在外部應用程式中模擬了 UI,並想出了一個粗略的外觀概念。

我們將地圖的各個部分導出為 .png,並將其匯入 Studio。

建立地圖
在 Studio 中建立地圖涉及使用 Parts 和 SurfaceGuis。
對於非互動元素,我們需要做的只是將 SurfaceGui 物件添加到部分中。
對於互動元素,SurfaceGui 也需要位於 StarterGui 容器內,並且 Adornee 屬性必須鏈接到 3D 工作區中的適當部分。這樣可以讓您添加按鈕事件。
為了實現視差效果,我們使用了三個分開的 ScreenGui 實例,分配給三個具有不同 X 值的獨特 Parts。

然後,我們使用 SurfaceGui.LightInfluence 屬性添加了發光效果。如果您將屬性值設置為 1 以下,則可以啟用 SurfaceGui.Brightness 屬性。通過調整亮度,您可以增加從圖像發出的光暈。
為了讓使用者切換地圖的顯示,我們使用了附加到 3D 模型的 ProximityPrompt。這是一種允許使用者與世界元素互動的簡單方法。

最後,使用 ReplicatedStorage 中的 UITweenModule ModuleScript,我們用 TweenService 和一些邏輯來動畫化 UI 的隱藏和顯示。通過追蹤使用者點擊的內容,我們可以透過動畫化各種屬性(如透明度、位置和大小)來隱藏和顯示元素。
UITweenModule 模組腳本local 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, --如果為 true,則反轉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, --如果為 true,則反轉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, --如果為 true,則反轉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, --如果為 true,則反轉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, --如果為 true,則反轉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, --如果為 true,則反轉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 模組local UITween = require(ReplicatedStorage.UITweenModule)-- 找到玩家 Guis 和 UI 物件local playerGui = game:GetService('Players').LocalPlayer:WaitForChild('PlayerGui')local screenGuiMapUIFrame = playerGui:WaitForChild("ScreenGuiMapUIFrame").SurfaceGuilocal mapUIFrameStroke = screenGuiMapUIFrame.FrameStrokelocal mapUIFrameFill = screenGuiMapUIFrame.FrameFill-- 用於 tween 的大小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)-- 範例 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)
這是互動地圖的最終結果: