Understand existing Unity uGUI, make targeted edits, and generate new Canvas-based hierarchies.
When working with ScrollRect/ScrollView, read the reference file:
references/scrollview-setup.md — Required hierarchy, setup rules, and common failures
Scope
Determine what the user is asking for:
| Request Type |
Action |
| Question about UI |
Understand — analyze hierarchy, explain structure |
| Change specific element |
Edit — targeted modification only |
| Create new UI |
Generate — create new hierarchy |
| Fix/improve existing UI |
Edit — modify existing, don't rebuild |
Generate only what is requested:
| Request |
Output |
| UI layout |
Prefab or scene hierarchy only |
| "with code" / "with logic" / "functional" |
Hierarchy + scripts |
These do NOT imply scripts:
- "proper buttons" → well-configured Button components
- "working UI" → valid hierarchy that renders
- "menu screen" → visual layout only
Critical Rules
Namespace disambiguation:
- Always use fully qualified type names when creating or referencing UI components
UnityEngine.UI.Image, not Image
UnityEngine.UI.Button, not Button
- Other namespaces in the project can cause ambiguous type errors
Verify before modifying:
- Always check what currently exists before making changes
- Confirm parent objects exist before adding children
- Verify components are present before modifying properties
- Never assume hierarchy state — query it first
Incremental fixes over rebuilds:
- When fixing issues, make targeted corrections
- Never destroy and recreate entire hierarchies to fix problems — destroyed objects cause null reference cascades
- Prefer identifying the specific broken property and fixing only that over rewriting large sections
- When a fix fails, revert the change before trying an alternative approach
One change at a time:
- Make a single change, then verify the result
- Do not batch multiple unrelated modifications
- Be careful not to inadvertently modify or remove adjacent elements when editing a specific one
- If something fails, understand why before trying alternatives
- Avoid "shotgun debugging" with multiple simultaneous changes
Color and visibility:
- Ensure text is readable by default: When choosing colors, ensure text contrasts with its background — but respect intentional low-contrast uses (disabled states, placeholder text, decorative elements)
- Check visibility for new elements: After creating UI elements, verify they have non-zero size and are within parent bounds. Elements intentionally created hidden (for later toggling, animation, etc.) are fine
Specification adherence:
- Honor user specifications exactly: When the user provides pixel dimensions, hex colors, positions, spacing, or other exact values, apply them precisely — do not approximate or substitute
- Minimize unrelated changes: When editing, avoid changing properties the user didn't ask about unless a related adjustment is necessary for the fix to work
Conventions
Follow project patterns first. Search existing files before applying defaults.
| Type |
Convention |
Good |
Bad |
| GameObject names |
PascalCase |
SubmitButton |
submit-button |
| Prefab paths |
Feature folders |
Assets/UI/Inventory/ |
Assets/Prefabs/UI/ |
Workflow
- Verify state — Check what exists in the scene/hierarchy before any action.
- Analyze — Determine exactly what's needed. No extras.
- Search — Find existing prefabs, canvases, assets. Don't assume paths.
- Follow project patterns — Match folder structure and naming.
- Create or edit — Build structure with proper anchoring, or make targeted edits.
- Confirm result — Verify the change worked before moving on.
Canvas Setup
Every UI needs a Canvas:
Canvas (Screen Space - Overlay or Camera)
├── CanvasScaler (Scale With Screen Size recommended)
├── GraphicRaycaster
└── [UI Content]
CanvasScaler settings:
- Default to UI Scale Mode "Scale With Screen Size" unless the project has a specific reason for "Constant Pixel Size" (e.g., pixel-art, fixed-resolution targets)
- Reference Resolution: Match project standards (e.g., 1920x1080)
- When creating a Canvas with Screen Space - Camera, read the camera's reference resolution first
- Match Width Or Height: 0.5 (balanced)
- If an existing Canvas uses "Constant Pixel Size", flag it and ask the user before changing
- Prefer anchors and Layout Groups over absolute pixel positions for layout
Layout Components
Layout Groups control child sizing:
- When a parent has a Layout Group, it manages child RectTransforms
- Children's anchors and sizeDelta may be overridden by the parent
- Understand whether the parent or child controls size before setting values
Vertical/Horizontal Layout Groups:
- Control Child Size: determines if parent sets child dimensions
- Child Force Expand: determines if children stretch to fill space
- If Control Child Size is off, children must have explicit sizes
Avoiding layout conflicts:
- Do not manually set child anchors/size when parent controls them
- Do not add Layout Group to an element that should have fixed size
- Nested Layout Groups require careful configuration of each level
- When layout is wrong, check parent settings before modifying child
- ContentSizeFitter on the same object as a Layout Group that has Control Child Size enabled = conflict
- ContentSizeFitter on a child whose parent has Control Child Size enabled = ContentSizeFitter is overridden (wasted)
- When using ContentSizeFitter with a Layout Group parent, disable Control Child Size on the parent for the relevant axis
- Common pattern: ScrollView Content should have ContentSizeFitter + VerticalLayoutGroup where VLG controls children but ContentSizeFitter sizes the Content itself
Grid Layout Group:
- For inventory grids, card layouts
- Cell Size must be set explicitly — children are sized to match
- Constraint controls row/column limits
Content Size Fitter:
- Horizontal/Vertical Fit: Preferred Size
- Use on containers that should size to their content
- Requires a layout element or text component to provide preferred size
RectTransform Anchoring
Elements must have non-zero size to be visible:
- Set explicit width/height via sizeDelta, or
- Use stretch anchors with proper offsets, or
- Let a parent Layout Group control size (with Control Child Size enabled)
Anchor configuration order:
- Set anchor preset first (corner, edge, or stretch)
- Then set position/offset values
- Verify the resulting size is non-zero
Common patterns:
- Stretch anchors — for responsive elements that fill available space
- Corner anchors — for fixed-position, fixed-size elements
- Edge anchors — for elements that stretch in one direction only
Positioning from natural language descriptions:
When the user describes a position (e.g., "top right", "bottom bar", "left side"):
- Determine if it's a corner (fixed point), an edge (stretch along one axis), or fill (stretch both axes)
- Set anchor min and anchor max — for corners these are the same point; for edges/fill they span a range
- Set pivot to match the anchor point — pivot must align with where the element is anchored, not left at the default (0.5, 0.5). A "top right" element needs pivot at the top-right corner; a "top bar" needs pivot at the top edge center
- Set position/offset values after anchors and pivot are configured
Visibility checklist:
- Width and height are both greater than zero
- Element is within parent bounds
- Element is not obscured by siblings (check hierarchy order)
- Image component has a sprite or color with alpha > 0
Common Components
| Component |
Use Case |
Image |
Backgrounds, icons |
RawImage |
Render textures, videos |
Text (TMP) |
All text (use TextMeshPro) |
Button |
Clickable elements |
Toggle |
Checkboxes, radio buttons |
Slider |
Value ranges |
ScrollRect |
Scrollable content |
InputField (TMP) |
Text input |
Best Practices
- Use TextMeshPro for all text (not legacy Text)
- WorldSpace UI that have text should also use Text Mesh Pro, be sure to review the project and import the TMP essentials if they are not present in the project
- If the TextMeshPro Essentials were imported be sure to close the TMP Importer Windows and the Import Unity Package Window once the assets are imported
- Organize hierarchy logically (Header, Content, Footer)
- Use Layout Groups instead of manual positioning where possible
- Set Raycast Target = false on non-interactive images
- Use sprite atlases for performance
Never use EditorApplication.ExecuteMenuItem("Window/TextMeshPro/Import TMP Essential Resources"), unless the user asks for an interactive TMP Essentials installation. It opens a modal dialog that blocks whatever invoked it until a human dismisses it.
Do not use AssetDatabase.ImportPackage() for TMP resources, instead TMP_PackageResourceImporter.ImportResources() is the canonical non-interactive API.
Interaction Readiness
Before completing any UI that contains interactive elements, verify:
- EventSystem must exist in the scene (exactly one)
- GraphicRaycaster must be on the Canvas
- Raycast Target = true on interactive elements (and false on non-interactive ones to avoid blocking)
- Button.onClick should be wired (via inspector or script) — only when scripts or logic were requested
If the first three are missing, interactive elements will exist visually but fail silently.
Understanding
When the user asks questions about existing UI:
Read the hierarchy first. Don't assume — always inspect the scene or prefab before answering.
Analyze structure:
- Identify the Canvas and its render mode
- Map the parent-child relationships
- Identify which Layout Groups control which children
- Check RectTransform anchor configurations
Answer questions about:
- "What does this button do?" → Explain component, hierarchy position, event wiring
- "How is this laid out?" → Describe Layout Groups, anchoring, hierarchy
- "Why is this invisible?" → Check size, anchors, parent bounds, component state
- "What controls this element's size?" → Trace Layout Group settings or anchors
Editing
For targeted changes to existing UI:
Read before editing. Always inspect the current state first.
Edit workflow:
- Verify the target object exists
- Identify the specific property or component to change
- Make the minimal change required
- Verify the result before proceeding
Never destroy to fix:
- Destroying objects cascades to null references elsewhere
- Fix properties in place rather than recreating
- If an element must be removed, update all references first
C# (Only When Requested)
- Use fully qualified UI types to avoid namespace conflicts
- Use
[SerializeField] for inspector references
- Cache component references in Awake()
- Use events/delegates for button callbacks
- Place scripts in same folder as prefabs (follow project patterns)
Component references:
- Verify referenced objects exist before accessing them
- Handle cases where serialized references may be null
- When wiring up references, confirm the target component is present
Error Recovery
When something goes wrong:
Stop and diagnose:
- Identify the exact error or symptom
- Determine the root cause before attempting fixes
- Do not make speculative changes
Fix incrementally:
- Address one issue at a time
- Verify each fix before moving to the next
- Keep track of what was changed
Avoid destructive patterns:
- "Start fresh" strategies destroy working elements along with broken ones
- Rebuilding entire hierarchies creates more problems than it solves
- Prefer surgical fixes to wholesale replacements
When stuck:
- Re-verify the current state of the hierarchy
- Check if previous changes were actually applied
- Consider if the approach itself is wrong rather than the implementation
1---2name: ui-ugui3description: Unity uGUI (Canvas-based) UI expert. Understands, edits, and generates Canvas hierarchies, RectTransforms, Layout Groups, and prefab UI. Use for requests involving Canvas, uGUI, RectTransform, or .prefab UI files.4---56Understand existing Unity uGUI, make targeted edits, and generate new Canvas-based hierarchies.78When working with ScrollRect/ScrollView, read the reference file:9- `references/scrollview-setup.md` — Required hierarchy, setup rules, and common failures1011## Scope1213Determine what the user is asking for:1415| Request Type | Action |16|--------------|--------|17| Question about UI | **Understand** — analyze hierarchy, explain structure |18| Change specific element | **Edit** — targeted modification only |19| Create new UI | **Generate** — create new hierarchy |20| Fix/improve existing UI | **Edit** — modify existing, don't rebuild |2122**Generate only what is requested:**2324| Request | Output |25|---------|--------|26| UI layout | Prefab or scene hierarchy only |27| "with code" / "with logic" / "functional" | Hierarchy + scripts |2829**These do NOT imply scripts:**30- "proper buttons" → well-configured Button components31- "working UI" → valid hierarchy that renders32- "menu screen" → visual layout only3334## Critical Rules3536**Namespace disambiguation:**37- Always use fully qualified type names when creating or referencing UI components38- `UnityEngine.UI.Image`, not `Image`39- `UnityEngine.UI.Button`, not `Button`40- Other namespaces in the project can cause ambiguous type errors4142**Verify before modifying:**43- Always check what currently exists before making changes44- Confirm parent objects exist before adding children45- Verify components are present before modifying properties46- Never assume hierarchy state — query it first4748**Incremental fixes over rebuilds:**49- When fixing issues, make targeted corrections50- Never destroy and recreate entire hierarchies to fix problems — destroyed objects cause null reference cascades51- Prefer identifying the specific broken property and fixing only that over rewriting large sections52- **When a fix fails, revert the change** before trying an alternative approach5354**One change at a time:**55- Make a single change, then verify the result56- Do not batch multiple unrelated modifications57- Be careful not to inadvertently modify or remove adjacent elements when editing a specific one58- If something fails, understand why before trying alternatives59- Avoid "shotgun debugging" with multiple simultaneous changes6061**Color and visibility:**62- **Ensure text is readable by default:** When choosing colors, ensure text contrasts with its background — but respect intentional low-contrast uses (disabled states, placeholder text, decorative elements)63- **Check visibility for new elements:** After creating UI elements, verify they have non-zero size and are within parent bounds. Elements intentionally created hidden (for later toggling, animation, etc.) are fine6465**Specification adherence:**66- **Honor user specifications exactly:** When the user provides pixel dimensions, hex colors, positions, spacing, or other exact values, apply them precisely — do not approximate or substitute67- **Minimize unrelated changes:** When editing, avoid changing properties the user didn't ask about unless a related adjustment is necessary for the fix to work6869## Conventions7071**Follow project patterns first.** Search existing files before applying defaults.7273| Type | Convention | Good | Bad |74|------|------------|------|-----|75| GameObject names | PascalCase | `SubmitButton` | `submit-button` |76| Prefab paths | Feature folders | `Assets/UI/Inventory/` | `Assets/Prefabs/UI/` |7778## Workflow79801. **Verify state** — Check what exists in the scene/hierarchy before any action.812. **Analyze** — Determine exactly what's needed. No extras.823. **Search** — Find existing prefabs, canvases, assets. Don't assume paths.834. **Follow project patterns** — Match folder structure and naming.845. **Create or edit** — Build structure with proper anchoring, or make targeted edits.856. **Confirm result** — Verify the change worked before moving on.8687## Canvas Setup8889Every UI needs a Canvas:9091```92Canvas (Screen Space - Overlay or Camera)93├── CanvasScaler (Scale With Screen Size recommended)94├── GraphicRaycaster95└── [UI Content]96```9798**CanvasScaler settings:**99- Default to UI Scale Mode "Scale With Screen Size" unless the project has a specific reason for "Constant Pixel Size" (e.g., pixel-art, fixed-resolution targets)100- Reference Resolution: Match project standards (e.g., 1920x1080)101- When creating a Canvas with Screen Space - Camera, **read the camera's reference resolution** first102- Match Width Or Height: 0.5 (balanced)103- If an existing Canvas uses "Constant Pixel Size", flag it and ask the user before changing104- Prefer anchors and Layout Groups over absolute pixel positions for layout105106## Layout Components107108**Layout Groups control child sizing:**109- When a parent has a Layout Group, it manages child RectTransforms110- Children's anchors and sizeDelta may be overridden by the parent111- Understand whether the parent or child controls size before setting values112113**Vertical/Horizontal Layout Groups:**114- Control Child Size: determines if parent sets child dimensions115- Child Force Expand: determines if children stretch to fill space116- If Control Child Size is off, children must have explicit sizes117118**Avoiding layout conflicts:**119- Do not manually set child anchors/size when parent controls them120- Do not add Layout Group to an element that should have fixed size121- Nested Layout Groups require careful configuration of each level122- When layout is wrong, check parent settings before modifying child123- ContentSizeFitter on the **same** object as a Layout Group that has Control Child Size enabled = conflict124- ContentSizeFitter on a child whose parent has Control Child Size enabled = ContentSizeFitter is overridden (wasted)125- When using ContentSizeFitter with a Layout Group parent, disable Control Child Size on the parent for the relevant axis126- Common pattern: ScrollView Content should have ContentSizeFitter + VerticalLayoutGroup where VLG controls children but ContentSizeFitter sizes the Content itself127128**Grid Layout Group:**129- For inventory grids, card layouts130- Cell Size must be set explicitly — children are sized to match131- Constraint controls row/column limits132133**Content Size Fitter:**134- Horizontal/Vertical Fit: Preferred Size135- Use on containers that should size to their content136- Requires a layout element or text component to provide preferred size137138## RectTransform Anchoring139140**Elements must have non-zero size to be visible:**141- Set explicit width/height via sizeDelta, or142- Use stretch anchors with proper offsets, or143- Let a parent Layout Group control size (with Control Child Size enabled)144145**Anchor configuration order:**1461. Set anchor preset first (corner, edge, or stretch)1472. Then set position/offset values1483. Verify the resulting size is non-zero149150**Common patterns:**151- **Stretch anchors** — for responsive elements that fill available space152- **Corner anchors** — for fixed-position, fixed-size elements153- **Edge anchors** — for elements that stretch in one direction only154155**Positioning from natural language descriptions:**156When the user describes a position (e.g., "top right", "bottom bar", "left side"):1571. Determine if it's a **corner** (fixed point), an **edge** (stretch along one axis), or **fill** (stretch both axes)1582. Set anchor min and anchor max — for corners these are the same point; for edges/fill they span a range1593. **Set pivot to match the anchor point** — pivot must align with where the element is anchored, not left at the default (0.5, 0.5). A "top right" element needs pivot at the top-right corner; a "top bar" needs pivot at the top edge center1604. Set position/offset values **after** anchors and pivot are configured161162**Visibility checklist:**163- Width and height are both greater than zero164- Element is within parent bounds165- Element is not obscured by siblings (check hierarchy order)166- Image component has a sprite or color with alpha > 0167168## Common Components169170| Component | Use Case |171|-----------|----------|172| `Image` | Backgrounds, icons |173| `RawImage` | Render textures, videos |174| `Text (TMP)` | All text (use TextMeshPro) |175| `Button` | Clickable elements |176| `Toggle` | Checkboxes, radio buttons |177| `Slider` | Value ranges |178| `ScrollRect` | Scrollable content |179| `InputField (TMP)` | Text input |180181## Best Practices182183- Use TextMeshPro for all text (not legacy Text)184- WorldSpace UI that have text should also use Text Mesh Pro, be sure to review the project and import the TMP essentials if they are not present in the project185- If the TextMeshPro Essentials were imported be sure to close the TMP Importer Windows and the Import Unity Package Window once the assets are imported186- Organize hierarchy logically (Header, Content, Footer)187- Use Layout Groups instead of manual positioning where possible188- Set Raycast Target = false on non-interactive images189- Use sprite atlases for performance190191**Never use** `EditorApplication.ExecuteMenuItem("Window/TextMeshPro/Import TMP Essential Resources")`, unless the user asks for an interactive TMP Essentials installation. It opens a modal dialog that blocks whatever invoked it until a human dismisses it.192193**Do not use** `AssetDatabase.ImportPackage()` for TMP resources, instead `TMP_PackageResourceImporter.ImportResources()` is the canonical non-interactive API.194195## Interaction Readiness196197Before completing any UI that contains interactive elements, verify:1981991. **EventSystem** must exist in the scene (exactly one)2002. **GraphicRaycaster** must be on the Canvas2013. **Raycast Target = true** on interactive elements (and false on non-interactive ones to avoid blocking)2024. **Button.onClick should be wired** (via inspector or script) — only when scripts or logic were requested203204If the first three are missing, interactive elements will exist visually but fail silently.205206## Understanding207208When the user asks questions about existing UI:209210**Read the hierarchy first.** Don't assume — always inspect the scene or prefab before answering.211212**Analyze structure:**213- Identify the Canvas and its render mode214- Map the parent-child relationships215- Identify which Layout Groups control which children216- Check RectTransform anchor configurations217218**Answer questions about:**219- "What does this button do?" → Explain component, hierarchy position, event wiring220- "How is this laid out?" → Describe Layout Groups, anchoring, hierarchy221- "Why is this invisible?" → Check size, anchors, parent bounds, component state222- "What controls this element's size?" → Trace Layout Group settings or anchors223224## Editing225226For targeted changes to existing UI:227228**Read before editing.** Always inspect the current state first.229230**Edit workflow:**2311. Verify the target object exists2322. Identify the specific property or component to change2333. Make the minimal change required2344. Verify the result before proceeding235236**Never destroy to fix:**237- Destroying objects cascades to null references elsewhere238- Fix properties in place rather than recreating239- If an element must be removed, update all references first240241## C# (Only When Requested)242243- Use fully qualified UI types to avoid namespace conflicts244- Use `[SerializeField]` for inspector references245- Cache component references in Awake()246- Use events/delegates for button callbacks247- Place scripts in same folder as prefabs (follow project patterns)248249**Component references:**250- Verify referenced objects exist before accessing them251- Handle cases where serialized references may be null252- When wiring up references, confirm the target component is present253254## Error Recovery255256When something goes wrong:257258**Stop and diagnose:**259- Identify the exact error or symptom260- Determine the root cause before attempting fixes261- Do not make speculative changes262263**Fix incrementally:**264- Address one issue at a time265- Verify each fix before moving to the next266- Keep track of what was changed267268**Avoid destructive patterns:**269- "Start fresh" strategies destroy working elements along with broken ones270- Rebuilding entire hierarchies creates more problems than it solves271- Prefer surgical fixes to wholesale replacements272273**When stuck:**274- Re-verify the current state of the hierarchy275- Check if previous changes were actually applied276- Consider if the approach itself is wrong rather than the implementation