Creating & Integrating Custom Panels
Now that your menu system is structured and optimized, it’s time to make it your own.
Ultimate Menu System is designed to be extensible — so whether you’re building an inventory screen, quest log, or settings panel, you can plug it into the system with just a few interface functions. This approach keeps things modular, readable, and Blueprint-friendly.
Let’s go over how to build custom panels that work seamlessly with the menu manager, navigation system, and tab constructor.
Creating a New Widget
Here’s how to get started:
- In your content browser, create a new User Widget
- Name it something like WB_CustomPanel
- Open it, and from the top bar go to Class Settings
- Add the interface: Interface_MenuManager
- Compile — now you’ll see interface events appear under the Interfaces section
These events are the bridge between your custom panel and the overall system.
Required Interface Functions
Here are the ones you must implement (or at least leave stubbed):
- GetNavigables
- Return an array of Buttons (or widgets) that the navigation system should focus on
- This defines what users can navigate with keyboard or gamepad
- On Panel Loaded
- Called when this panel is shown
- Use this to trigger animations, play sounds, or initialize content
- On Panel Unloaded (optional)
- Called when this panel is removed
- Great for cleanup logic
Supporting Aspect Ratio Changes
If your panel has layout-sensitive content, you can support responsive scaling with:
- Get Content to Fit
- Return a reference to an overlay (or wrapper) that scales properly
- This keeps UI consistent when the window resolution changes
- Default ratio is 1920×1080, but it’s fully adjustable from WB_MenuMaster
Example setup:
- Wrap your content with a Scale Box or Overlay
- Return that wrapper in Get Content to Fit
Creating Tab-Compatible Panels
If your panel is used within a Tabbed Menu Constructor, you’ll need to implement two more functions:
- Get Tab Constructor Reference
- Return a reference to the WB_TabMenuConstructor in this widget
- Allows the navigation system to route input correctly
- Get Tab Buttons
- Return the list of tab buttons
- Usually a simple array of buttons tied to panels
You can copy this logic directly from WB_TabbedMainMenuPanel as a reference.
Debugging Navigation Issues
If your panel isn’t responding to input:
- Double-check that you implemented GetNavigables
- Make sure buttons are set to Is Focusable = True
- If using tabs, verify that you’re routing through the active child panel
Adding simple Print Strings to On Panel Loaded and GetNavigables can help you verify that everything is being called properly.
Panel Lifecycle Events
Here’s a quick overview of how panels are loaded:
- You call Load Content From Class
- System creates (or reuses) the panel from the widget pool
- On Panel Loaded is triggered
- System handles animations and input routing
- When a new panel is loaded, On Panel Unloaded fires on the previous one
Keeping your logic inside these hooks ensures modularity — and avoids having too many hard references between panels.
What’s Next?
Now you know how to build and integrate your own widgets like a pro.
In the next section, we’ll enhance the user experience by adding visual systems — including dynamic camera transitions, interactive request boxes, and subtle animation polish.