Menu Construction: Tabs, Master Config & Pooling
Your menu’s foundation is now in place — inputs are working and your navigation feels responsive. Now it’s time to structure your UI like a real game menu.
This system gives you a flexible Tab Menu Constructor, a centralized master menu configuration, and a built-in widget pooling system to optimize performance. Let’s go step by step.
Tab Menu Constructor
Tabbed menus let you organize complex panels (like Settings, Save/Load, etc.) in a way that’s clean and scalable. The constructor handles the button-panel relationship automatically.
Here’s how to set up a tabbed menu:
- In your widget (e.g. WB_MainMenuPanel), add the WB_TabMenuConstructor widget
- Under the exposed variables, assign:
- Buttons (array of tab buttons)
- Panels (array of content widgets)
- Make sure the index of each button matches the index of the panel it should display
Example: Button[0] shows Panel[0], Button[1] shows Panel[1], etc.
Once set up, the constructor will automatically switch panels and focus based on input.
Working with Tab Navigation
To connect tab navigation:
- Implement Get Tab Constructor Reference
- Just return a reference to your WB_TabMenuConstructor
- When GetNavigables is called, pass it from the active tab’s panel — not the parent panel
- This way, input always focuses on the correct active content
Master Menu Configuration (WB_MenuMaster)
This is your control center for how the UI behaves across the board.
Here’s what you can configure:
- Animation behavior (fade speeds, transition delays)
- Aspect ratio enforcement
- Initial panel or camera position
- Input delay values
- Tilt UI toggle for gamepad movement effects
- Keybinding overrides (Pause, Return, etc.)
To access:
- Open WB_MenuMaster
- In the Designer tab, select the root widget
- You’ll see all exposed variables under the Details Panel
These settings apply globally — meaning you don’t need to hardcode delays or animation logic in each panel.
Widget Pooling System
One of the most performance-critical parts of UMG is how widgets are created. Spawning a complex widget at runtime can cause noticeable lag — especially on lower-end hardware.
This system solves that with widget pooling.
Here’s how it works:
- On game start, UMS pre-creates a list of widgets
- These widgets are stored in a pool and reused throughout the session
- If a widget is missing, it’s created once and then added to the pool for future use
To configure the pool:
- Open WB_MenuMaster
- Find the Widget Pool Array
- Add any widgets you want preloaded (e.g. WB_SettingsPanel, WB_PauseMenu, etc.)
Tip: You can still create panels at runtime — the system will just cache them after the first load. But adding them ahead of time gives a smoother experience.
Customizing Transitions
Want to change how panels slide in/out?
- Use Load Content From Class for animated transitions
- You can select animation types, or force an override
- Panels can load instantly or wait for animation logic to finish — your choice
What’s Next?
Now your UI is clean, optimized, and modular — with tabbed panels, reusable widgets, and global control from a single menu blueprint.
In the next page, we’ll explore how to create your own custom panels and make them fully compatible with Ultimate Menu System using interfaces and panel events.