Wir wollten eine interaktive Karten-Benutzeroberfläche hinzufügen, damit Benutzer Informationen in der Raumstation konsumieren können, die sich wie in dieser Welt anfühlten und aussahen.Wir haben beschlossen, die Karte im 3D-Raum zu erstellen, anstatt auf einem Bildschirm, der die Erlebnisüberliert.Diese Art der didaktischen Visualisierung ermöglicht mehr Immersion mit der Welt im Gegensatz zu dem Gefühl, als wäre es eine völlig separate Erlebnis.
Entwerfen der Karte
Um die Karte zu entwerfen:
Wir haben die UI in einer externen Anwendung verspottet und kamen mit einer groben Idee, wie sie aussehen sollte.
Wir haben die einzelnen Teile der Karte als .png exportiert und sie in Studio importiert.
Baue die Karte auf
Das Erstellen der Karte innerhalb von Studio erfordert die Verwendung von Parts und SurfaceGuis.
Für nicht interaktive Elemente mussten wir nur ein SurfaceGui-Objekt zum Teil hinzufügen.
Für interaktive Elemente muss der SurfaceGui auch innerhalb des StarterGui Containers sein, mit der Adornee Eigenschaft, die mit der entsprechenden Teil in der 3D-Arbeitsumgebung verknüpft ist.Dadurch kannst du Knopfereignisse hinzufügen.
Um einen Parallaxeneffekt zu erzielen, verwendeten wir drei separate ScreenGui, die drei einzigartigen Parts mit unterschiedlichen X -Werten zugewiesen wurden.
Wir fügten dann einen Glüh效ekt mit der EigenschaftenSurfaceGui.LightInfluence hinzu.Wenn du den Eigenschaftswert auf weniger als 1 festlegst, aktiviert es die EigenschaftenSurfaceGui.Brightness.Durch Anpassung der Helligkeit kannst du die Glanzemission aus dem Bild erhöhen.
Um Benutzern zu ermöglichen, die Anzeige der Karte umzuschalten, verwendeten wir ein ProximityPrompt, das wir an ein 3D-Modell anfügten.Dies ist eine einfache Möglichkeit, die Interaktion eines Benutzers mit Welt元en zu ermöglichen.
Schließlich verwenden wir ein UITweenModule-Module-Skript innerhalb von ReplicatedStorage, um die UI mit TweenService und ein bisschen Logik zum Feststellen des Zustands zu animieren.Durch das Verfolgen, was der Benutzer angeklickt hat, konnten wir Elemente ausblenden und anzeigen, indem wir verschiedene Eigenschaften wie Alpha, Position und Größe durchschalten.
UITweenModule-Skriptmodullocal TweenService = game:GetService("TweenService")local UITween = {}-- für verschwindende bilderfunction UITween.fadePart(object, amount, time, delay)local tweenAlpha = TweenInfo.new(time, --ZeitEnum.EasingStyle.Quad, --EntspannungsstilEnum.EasingDirection.Out, --Entlastungsrichtung0, --Zählen wiederholenfalse, --Revertiert, wenn wahrdelay --Verzögerungszeit)local tween = TweenService:Create(object, tweenAlpha, {Transparency = amount})tween:Play()endfunction UITween.fade(object, amount, time, delay)local tweenAlpha = TweenInfo.new(time, --ZeitEnum.EasingStyle.Quad, --EntspannungsstilEnum.EasingDirection.Out, --Entlastungsrichtung0, --Zählen wiederholenfalse, --Revertiert, wenn wahrdelay --Verzögerungszeit)local tween = TweenService:Create(object, tweenAlpha, {ImageTransparency = amount})tween:Play()end-- für verschwindende bilderfunction UITween.fadeBackground(object, amount, time, delay)local tweenAlpha = TweenInfo.new(time, --ZeitEnum.EasingStyle.Quad, --EntspannungsstilEnum.EasingDirection.Out, --Entlastungsrichtung0, --Zählen wiederholenfalse, --Revertiert, wenn wahrdelay --Verzögerungszeit)local tween = TweenService:Create(object, tweenAlpha, {BackgroundTransparency = amount})tween:Play()end-- für verschwindenden textfunction UITween.fadeText(object, amount, time, delay)local tweenAlpha = TweenInfo.new(time, --ZeitEnum.EasingStyle.Quad, --EntspannungsstilEnum.EasingDirection.Out, --Entlastungsrichtung0, --Zählen wiederholenfalse, --Revertiert, wenn wahrdelay --Verzögerungszeit)local tween1 = TweenService:Create(object, tweenAlpha, {TextTransparency = amount})tween1:Play()end-- zum bewegen von text und bildernfunction UITween.move(object, position, time, delay)task.wait(delay)object:TweenPosition(position, Enum.EasingDirection.Out, Enum.EasingStyle.Quint, time)end-- zur größenänderungfunction UITween.size(object, size, time, delay, override, callback)local tweenSize = TweenInfo.new(time, --ZeitEnum.EasingStyle.Quint, --EntspannungsstilEnum.EasingDirection.Out, --Entlastungsrichtung0, --Zählen wiederholenfalse, --Revertiert, wenn wahrdelay, --Verzögerungszeitoverride,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, --ZeitEnum.EasingStyle.Quint, --EntspannungsstilEnum.EasingDirection.Out, --Entlastungsrichtung0, --Zählen wiederholenfalse, --Revertiert, wenn wahrdelay, --Verzögerungszeitoverride,callback)local tween = TweenService:Create(object, tweenSize, {Rotation = rotation})tween:Play()end-- zum verwischen der kamerafunction 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-- zum verwischen der kamerafunction 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 UITweenUI-Tween auf Objekte anwendenlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- UITween-Modul ergänzenlocal UITween = require(ReplicatedStorage.UITweenModule)-- Spieler-Guis und UI-Objekte findenlocal playerGui = game:GetService('Players').LocalPlayer:WaitForChild('PlayerGui')local screenGuiMapUIFrame = playerGui:WaitForChild("ScreenGuiMapUIFrame").SurfaceGuilocal mapUIFrameStroke = screenGuiMapUIFrame.FrameStrokelocal mapUIFrameFill = screenGuiMapUIFrame.FrameFill-- Größen für das Tweening verwendetlocal frameSizeStart = UDim2.new(0, 0, 0, 0)local frameSizeMid = UDim2.new(1, 0, 0.05, 0)local frameSizeEnd = UDim2.new(1, 0, 1, 0)-- Beispiel-TweeningUITween.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)
Hier ist das endgültige Ergebnis der interaktiven Karte: