

UI Manager is a Unity-based library for the game ROUNDS that simplifies the creation, customization, and runtime management of UI panels.
It provides a flexible system for building draggable, resizable, and configurable UI panels, along with a powerful UI Layout Manager that allows editing using a runtime gizmo.
The UI Layout Manager enables runtime manipulation of UI panels:
This allows both developers and players to fully customize UI positioning.
Create dynamic and customizable Option Panels for your UI:
The Tabholic mod demonstrates how to use UI Manager in practice. It uses:
Example behavior:
private void Awake() {
UIPanelInfo panel = GetComponentInParent<UIPanelInfo>();
panel.OnDisplayModeChnaged += (DisplayMode display) => {
if (display == DisplayMode.Normal) {
CreatePlayerStats();
} else if (display == DisplayMode.Layout) {
CreatePreviewStats();
}
};
}
This library currently supports Unity Project-based mods only.
It is not designed for mods developed purely in external IDEs like Visual Studio.
Example UI PanelsPanelID in UIPanelInfoUIPanelRegistrarUIPanelRegistrarUIPanelRegistrar registrar = Assets
.LoadAsset<GameObject>("Tabholic UI Register")
.GetComponent<UIPanelRegistrar>();
registrar.Register();
// Display ALL panels
foreach (var panel in registrar.UIPanelsPrefabs) {
UIRegistry.Instance
.GetLayoutPanel(panel.PanelID)
.Info.DisplayMode = DisplayMode.Normal;
}
// Display a specific panel
registrar
.GetLayoutPanel("MyPanelId")
.Info.DisplayMode = DisplayMode.Normal;
Create a class inheriting from SimpleContextPanel.
This system uses reflection to automatically generate UI fields from properties implementing IPropertyField.
public class MyPanelOptionPanel : SimpleContextPanel {
public static MyPanelOptionPanel Instance { get; private set; }
public FloatPropertyField MyFloat = new FloatPropertyField(0f, 1f, 0f);
public IntPropertyField MyInt = new IntPropertyField(0, 1, 0);
public BoolPropertyField MyBool = new BoolPropertyField(false);
private void Awake() {
Instance = this;
}
}
UIPanelInfo panelInfo = registrar.UIPanelsPrefabs.First();
OptionPanelRegistry.RegisterOptionMenu<MyPanelOptionPanel>(panelInfo);
public class EditorContextPanelRegister : MonoBehaviour {
public UIPanelInfo PrefabPanelInfo;
private void Awake() {
OptionPanelRegistry.RegisterOptionMenu<MyPanelOptionPanel>(PrefabPanelInfo);
}
}
MyPanelOptionPanel.Instance.MyFloat.Value;
MyPanelOptionPanel.Instance.MyBool.Value;
PanelID values to avoid conflicts