| # Unity UI |
|
|
| Unity ships two UI systems: |
|
|
| 1. **uGUI (UnityEngine.UI)** -- the Canvas-based system that has been |
| standard since Unity 4.6. Used by the generated `UIManager.cs`. |
| 2. **UI Toolkit** -- the new web-style (UXML/USS) system. Not used here. |
|
|
| ## Canvas |
|
|
| The `Canvas` is the root of every UI hierarchy. There are three render |
| modes: |
|
|
| | Mode | Use case | |
| |---------------------|-----------------------------------------------------------| |
| | `ScreenSpaceOverlay` | UI drawn on top of everything (default, cheapest) | |
| | `ScreenSpaceCamera` | UI positioned in front of a specific camera | |
| | `WorldSpace` | UI lives in the 3D world (health bars, dialogue bubbles) | |
|
|
| Set the **Canvas Scaler** to **Scale With Screen Size** with a reference |
| resolution of 1920x1080 for desktop games. |
|
|
| ## Common components |
|
|
| * `Image` -- a sprite or solid color rectangle. |
| * `Text` (uGUI) / `TMP_Text` (TextMeshPro) -- text. TMP produces sharper |
| glyphs and is preferred; the `UIManager.cs` generator uses `TMP_Text`. |
| * `Button` -- a clickable button with `onClick` events. |
| * `Slider` -- a draggable value selector. |
| * `Toggle` -- a checkbox. |
| * `ScrollRect` -- a scrolling viewport. |
| * `InputField` / `TMP_InputField` -- text entry. |
|
|
| ## Layout |
|
|
| * `VerticalLayoutGroup` / `HorizontalLayoutGroup` / `GridLayoutGroup` -- |
| auto-arrange children. |
| * `LayoutElement` -- override min/preferred sizes. |
| * `ContentSizeFitter` -- resize a container to fit its children. |
|
|
| ## Anchoring |
|
|
| Anchors determine how a UI element scales with its parent. Use the anchor |
| presets in the inspector to pin an element to a corner, edge, or center. |
|
|
| * Top-left HUD elements: anchor top-left. |
| * Health bars that grow left-to-right: anchor top-left, pivot `(0, 0.5)`. |
| * Centered messages: anchor middle-center. |
|
|
| ## Health bar recipe |
|
|
| ```csharp |
| public Image healthBarFill; |
| |
| private void Update() |
| { |
| healthBarFill.fillAmount = Mathf.Clamp01(currentHealth / maxHealth); |
| } |
| ``` |
|
|
| * Use an `Image` with `Image Type = Filled`, `Fill Method = Horizontal` to |
| get a depleting bar. |
| * Place a darker `Image` behind it as the background. |
| * For a world-space health bar, parent a Canvas to the enemy with |
| `Render Mode = World Space` and use a `LookAtCamera` script to keep it |
| facing the camera. |
|
|
| ## HUD wiring pattern |
|
|
| The generated `UIManager.cs` is a singleton that other systems call: |
|
|
| ```csharp |
| UIManager.Instance.SetScore(PickupSystem.Instance.score); |
| UIManager.Instance.SetHealth(health.Current, health.Max); |
| UIManager.Instance.SetMessage("Level Complete!"); |
| ``` |
|
|
| The HUD GameObjects (TMP_Text, Image) are assigned in the inspector. The |
| GameManager bootstrapper in the example game wires these up at runtime if |
| they are missing. |
| |
| ## Buttons and events |
| |
| ```csharp |
| [SerializeField] private Button restartButton; |
| |
| private void OnEnable() => restartButton.onClick.AddListener(Restart); |
| private void OnDisable() => restartButton.onClick.RemoveListener(Restart); |
| |
| private void Restart() => SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); |
| ``` |
| |
| * Always unsubscribe from events in `OnDisable` to avoid leaks. |
| * `UnityEvent` fields (e.g. `Button.onClick`) let designers wire callbacks |
| in the inspector without code changes. |
| |
| ## TMP essentials |
| |
| * Use `TMP_Text` instead of `Text` for any text the player reads -- the |
| rendering quality is dramatically better. |
| * Generate a TMP Font Asset via `Window > TextMeshPro > Font Asset Creator`. |
| * `TMP_Dropdown`, `TMP_InputField`, and `TMP_Text` are drop-in replacements |
| for the uGUI equivalents. |
|
|
| ## Performance |
|
|
| * Mark static UI elements as `Static` in the Canvas to batch them. |
| * Split a complex UI into multiple Canvases so a single text change does |
| not rebuild the entire hierarchy. |
| * Avoid `LayoutGroup` chains deeper than 3 levels on mobile -- they are |
| expensive to rebuild. |
| * Pool item tooltips, inventory slots and damage popups instead of |
| instantiating/destroying them every frame. |
|
|