Free tool
World UI layout editor
Tell World UI Kit where the clickable zones of your Widget Blueprint are: paste its hierarchy, check the zones it finds, try them as a player would, then download the Verse files. About World UI Kit
Your widget
Paste its hierarchy: the zones, the size and the path are read from it.
In the WBP Designer, select the root widget in the Hierarchy panel and press Ctrl+C. Paste it here, or anywhere on the page.
1200 × 800 units
In widget units, as in the Designer.
Writes the active screen to a Screen (int) field of the WBP. Bind it to the Active Widget Index of a WidgetSwitcher.
With States = PerPlayer, each player gets their own copy of the WBP, so its fields are personal too.
Clickable zones
Drag on an empty area of the widget to draw a zone, drag a zone to move it.
Drag on an empty area to draw a zone. Arrows move it by 1 unit (Shift: 10), Delete removes it, Ctrl+D duplicates it, Esc deselects. Hold Alt while dragging to turn snapping off. Two fingers pan a zoomed view.
Zones (12)
Select a zone on the canvas or in the list, or draw a new one.
Verse files
Describes the widget: download it again whenever the zones change.
1# World UI Kit layout for WBP_Shop. Made with https://store.simnjs.fr/tools/world-ui2# Widget Blueprint: /MyIsland/Shop/WBP_Shop3# 1. Save this file in your project's Content folder, next to the WorldUIKit folder. 2. Build Verse code.4# 3. Add the wbp_shop_layout component to your WBP_Shop entity, next to interactive_widget_component.5# It only describes the widget: download it again when the layout changes. Your actions go in wbp_shop_logic.verse.6using { /Verse.org/SceneGraph }7using { /Verse.org/Simulation }8using { WorldUIKit }9 10wbp_shop_layout<public> := class<final_super>(component, interactive_layout, interactive_fields):11 12 GetLayout<override>()<transacts>:interactive_layout_data =13 interactive_layout_data{Width := 1200.0, Height := 800.0, Elements := array{14 interactive_element{Name := "Items", Kind := interactive_kind.Tab, X := 664.0, Y := 40.0, Width := 232.0, Height := 72.0, StartOn := true, Group := "Tabs", OpensScreen := 1},15 interactive_element{Name := "Skins", Kind := interactive_kind.Tab, X := 912.0, Y := 40.0, Width := 232.0, Height := 72.0, Group := "Tabs", OpensScreen := 2},16 interactive_element{Name := "BuyBlade", Kind := interactive_kind.Button, X := 96.0, Y := 488.0, Width := 448.0, Height := 72.0, Prompt := "Buy the Storm Blade", Screen := 1, Cooldown := 0.5},17 interactive_element{Name := "BuyShield", Kind := interactive_kind.Button, X := 656.0, Y := 488.0, Width := 448.0, Height := 72.0, Prompt := "Buy the Shock Shield", Screen := 1, Cooldown := 0.5},18 interactive_element{Name := "SkinRed", Kind := interactive_kind.Choice, X := 56.0, Y := 148.0, Width := 344.0, Height := 300.0, StartOn := true, Group := "Skin", Screen := 2},19 interactive_element{Name := "SkinBlue", Kind := interactive_kind.Choice, X := 428.0, Y := 148.0, Width := 344.0, Height := 300.0, Group := "Skin", Screen := 2},20 interactive_element{Name := "SkinGold", Kind := interactive_kind.Choice, X := 800.0, Y := 148.0, Width := 344.0, Height := 300.0, StartEnabled := false, Group := "Skin", Screen := 2},21 interactive_element{Name := "Equip", Kind := interactive_kind.Button, X := 428.0, Y := 480.0, Width := 344.0, Prompt := "Equip", Screen := 2},22 interactive_element{Name := "Music", Kind := interactive_kind.Toggle, X := 56.0, Y := 640.0, Width := 312.0, Height := 96.0, StartOn := true},23 interactive_element{Name := "VolumeDown", Kind := interactive_kind.Stepper, X := 432.0, Y := 652.0, Width := 72.0, Height := 72.0, Prompt := "Volume down", Target := "Volume", Steps := -1},24 interactive_element{Name := "Volume", Kind := interactive_kind.Slider, X := 528.0, Y := 664.0, Width := 488.0, Height := 48.0, MaxValue := 100.0, Step := 5.0, StartValue := 75.0},25 interactive_element{Name := "VolumeUp", Kind := interactive_kind.Stepper, X := 1040.0, Y := 652.0, Width := 72.0, Height := 72.0, Prompt := "Volume up", Target := "Volume"}}}26 27 SetHovered<override>(Widget:entity, Element:string, On:logic):void =28 if (W := Shop.WBP_Shop_entity[Widget]):29 Value := if (On?) then 1.0 else 0.030 case (Element):31 "Items" => set W.ItemsHover = Value # Render Opacity of the widget to show32 "Skins" => set W.SkinsHover = Value # Render Opacity of the widget to show33 "BuyBlade" => set W.BuyBladeHover = Value # Render Opacity of the widget to show34 "BuyShield" => set W.BuyShieldHover = Value # Render Opacity of the widget to show35 "SkinRed" => set W.SkinRedHover = Value # Render Opacity of the widget to show36 "SkinBlue" => set W.SkinBlueHover = Value # Render Opacity of the widget to show37 "SkinGold" => set W.SkinGoldHover = Value # Render Opacity of the widget to show38 "Equip" => set W.EquipHover = Value # Render Opacity of the widget to show39 "Music" => set W.MusicHover = Value # Render Opacity of the widget to show40 "VolumeDown" => set W.VolumeDownHover = Value # Render Opacity of the widget to show41 "Volume" => set W.VolumeHover = Value # Render Opacity of the widget to show42 "VolumeUp" => set W.VolumeUpHover = Value # Render Opacity of the widget to show43 _ => {}44 45 SetPressed<override>(Widget:entity, Element:string, On:logic):void =46 if (W := Shop.WBP_Shop_entity[Widget]):47 Value := if (On?) then 1.0 else 0.048 case (Element):49 "BuyBlade" => set W.BuyBladePressed = Value # plays BuyBladePressedAnim50 "BuyShield" => set W.BuyShieldPressed = Value # plays BuyShieldPressedAnim51 "Equip" => set W.EquipPressed = Value # plays EquipPressedAnim52 "VolumeDown" => set W.VolumeDownPressed = Value # Render Opacity of the widget to show53 "VolumeUp" => set W.VolumeUpPressed = Value # Render Opacity of the widget to show54 _ => {}55 56 SetOn<override>(Widget:entity, Element:string, On:logic):void =57 if (W := Shop.WBP_Shop_entity[Widget]):58 Value := if (On?) then 1.0 else 0.059 case (Element):60 "Items" => set W.ItemsOn = Value # Render Opacity of the widget to show61 "Skins" => set W.SkinsOn = Value # Render Opacity of the widget to show62 "SkinRed" => set W.SkinRedOn = Value # Render Opacity of the widget to show63 "SkinBlue" => set W.SkinBlueOn = Value # Render Opacity of the widget to show64 "SkinGold" => set W.SkinGoldOn = Value # Render Opacity of the widget to show65 "Music" => set W.MusicOn = Value # plays MusicOnAnim66 _ => {}67 68 SetValue<override>(Widget:entity, Element:string, Value:float, Fraction:float, Text:string):void =69 if (W := Shop.WBP_Shop_entity[Widget]):70 case (Element):71 "Volume" =>72 set W.VolumeValue = Fraction # 0..1 along the slider73 set W.VolumeFill = Fraction * 488.0 # Width Override of the fill (a SizeBox)74 set W.VolumeText = InteractiveText(Text)75 _ => {}76 77 SetEnabled<override>(Widget:entity, Element:string, On:logic):void =78 if (W := Shop.WBP_Shop_entity[Widget]):79 Value := if (On?) then 0.0 else 1.080 case (Element):81 "SkinGold" => set W.SkinGoldDisabled = Value # Render Opacity of the widget to show82 _ => {}83 84 SetScreen<override>(Widget:entity, Screen:int):void =85 if (W := Shop.WBP_Shop_entity[Widget]):86 set W.Screen = Screen87 88 # Per-player copies (States = PerPlayer): a fresh widget of the same WBP.89 NewCopy<override>():?entity = option{Shop.WBP_Shop_entity{}}90 To check
No problem found.
Your layout is kept in this browser.