私たちは、ユーザーがこの世界に住んでいるかのように感じる宇宙ステーション内の情報を消費するために、インタラクティブなマップ UI を追加したいと思いました。私たちは、世界をこの世界に追加することを決めました、その代わり画面がエクスペリエンスを重複しないようにするために 3D 空間内にマップを構��
マップのデザイン
マップを設計するには:
私たちは外部のアプリケーションで UI をモックし、どのように見たいかについての概要を作成しました。
マップの個々の部品を .png としてエクスポートし、Studio にインポートしました。
マップを構築する
マップを Studio 内で構築するには、Parts とSurfaceGuis を使用しています。
非交互要素の場合、私たちはパーツに SurfaceGui オブジェクトを追加するだけです。
インタラクティブ要素の場合、SurfaceGui は、StarterGui コンテナの中にある必要があり、Adornee プロパティが 3D ワークスペースの適切な部分にリンクされています。これにより、ボタンイベントを追加できます。
パララックス効果を実現するには、3つの異なる ScreenGui インスタンス、そして 3つのユニークな Parts に割り当てられた 3つの異なる X 値を使用しています。
その後、SurfaceGui.LightInfluence プロパティで輝き効果を追加しました。プロパティ値を 1 以下に設定すると、SurfaceGui.Brightness プロパティがオンになります。輝きを調整することで、画像から輝きを増加させることができます。
ユーザーがマップの表示を切り替えることを許可するには、ProximityPrompt を使用しました。これは、世界の要素とユーザーのインタラクションを簡単に許可する方法です。
最後に、ReplicatedStorage の中の UITweenModuleModuleScript のモジュールスクリプトを使用して、UI を TweenService と少しのロジックで隠し表示し、状態を決定するために TweenService といくつかのロジックを追跡しました。ユーザーがクリックした内容を追跡することで、さまざまなプロパティの減少、位置、サイズなどを含むロジックを減少できます。
UITweenModule モジュールスクリプトlocal TweenService = game:GetService("TweenService")local UITween = {}-- フェイディング画像の場合function UITween.fadePart(object, amount, time, delay)local tweenAlpha = TweenInfo.new(time, --時間Enum.EasingStyle.Quad, --EasingStyleEnum.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, --EasingStyleEnum.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, --EasingStyleEnum.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, --EasingStyleEnum.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, --EasingStyleEnum.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, --EasingStyleEnum.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 UITweenUI ツイーンをオブジェクトに適用するlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- UIツインモジュールを追加local UITween = require(ReplicatedStorage.UITweenModule)-- プレイヤーGUI と UI オブジェクトを見つける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)
ここはインタラクティブマップの最終結果です: