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---5
6Understand existing Unity uGUI, make targeted edits, and generate new Canvas-based hierarchies.
7
8When working with ScrollRect/ScrollView, read the reference file:
9- `references/scrollview-setup.md` — Required hierarchy, setup rules, and common failures
10
11## Scope
12
13Determine what the user is asking for:
14
15| 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 |
21
22**Generate only what is requested:**
23
24| Request | Output |
25|---------|--------|
26| UI layout | Prefab or scene hierarchy only |
27| "with code" / "with logic" / "functional" | Hierarchy + scripts |
28
29**These do NOT imply scripts:**
30- "proper buttons" → well-configured Button components
31- "working UI" → valid hierarchy that renders
32- "menu screen" → visual layout only
33
34## Critical Rules
35
36**Namespace disambiguation:**
37- Always use fully qualified type names when creating or referencing UI components
38- `UnityEngine.UI.Image`, not `Image`
39- `UnityEngine.UI.Button`, not `Button`
40- Other namespaces in the project can cause ambiguous type errors
41
42**Verify before modifying:**
43- Always check what currently exists before making changes
44- Confirm parent objects exist before adding children
45- Verify components are present before modifying properties
46- Never assume hierarchy state — query it first
47
48**Incremental fixes over rebuilds:**
49- When fixing issues, make targeted corrections
50- Never destroy and recreate entire hierarchies to fix problems — destroyed objects cause null reference cascades
51- Prefer identifying the specific broken property and fixing only that over rewriting large sections
52- **When a fix fails, revert the change** before trying an alternative approach
53
54**One change at a time:**
55- Make a single change, then verify the result
56- Do not batch multiple unrelated modifications
57- Be careful not to inadvertently modify or remove adjacent elements when editing a specific one
58- If something fails, understand why before trying alternatives
59- Avoid "shotgun debugging" with multiple simultaneous changes
60
61**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 fine
64
65**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 substitute
67- **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
68
69## Conventions
70
71**Follow project patterns first.** Search existing files before applying defaults.
72
73| Type | Convention | Good | Bad |
74|------|------------|------|-----|
75| GameObject names | PascalCase | `SubmitButton` | `submit-button` |
76| Prefab paths | Feature folders | `Assets/UI/Inventory/` | `Assets/Prefabs/UI/` |
77
78## Workflow
79
801. **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.
86
87## Canvas Setup
88
89Every UI needs a Canvas:
90
91```
92Canvas (Screen Space - Overlay or Camera)
93├── CanvasScaler (Scale With Screen Size recommended)
94├── GraphicRaycaster
95└── [UI Content]
96```
97
98**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** first
102- Match Width Or Height: 0.5 (balanced)
103- If an existing Canvas uses "Constant Pixel Size", flag it and ask the user before changing
104- Prefer anchors and Layout Groups over absolute pixel positions for layout
105
106## Layout Components
107
108**Layout Groups control child sizing:**
109- When a parent has a Layout Group, it manages child RectTransforms
110- Children's anchors and sizeDelta may be overridden by the parent
111- Understand whether the parent or child controls size before setting values
112
113**Vertical/Horizontal Layout Groups:**
114- Control Child Size: determines if parent sets child dimensions
115- Child Force Expand: determines if children stretch to fill space
116- If Control Child Size is off, children must have explicit sizes
117
118**Avoiding layout conflicts:**
119- Do not manually set child anchors/size when parent controls them
120- Do not add Layout Group to an element that should have fixed size
121- Nested Layout Groups require careful configuration of each level
122- When layout is wrong, check parent settings before modifying child
123- ContentSizeFitter on the **same** object as a Layout Group that has Control Child Size enabled = conflict
124- 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 axis
126- Common pattern: ScrollView Content should have ContentSizeFitter + VerticalLayoutGroup where VLG controls children but ContentSizeFitter sizes the Content itself
127
128**Grid Layout Group:**
129- For inventory grids, card layouts
130- Cell Size must be set explicitly — children are sized to match
131- Constraint controls row/column limits
132
133**Content Size Fitter:**
134- Horizontal/Vertical Fit: Preferred Size
135- Use on containers that should size to their content
136- Requires a layout element or text component to provide preferred size
137
138## RectTransform Anchoring
139
140**Elements must have non-zero size to be visible:**
141- Set explicit width/height via sizeDelta, or
142- Use stretch anchors with proper offsets, or
143- Let a parent Layout Group control size (with Control Child Size enabled)
144
145**Anchor configuration order:**
1461. Set anchor preset first (corner, edge, or stretch)
1472. Then set position/offset values
1483. Verify the resulting size is non-zero
149
150**Common patterns:**
151- **Stretch anchors** — for responsive elements that fill available space
152- **Corner anchors** — for fixed-position, fixed-size elements
153- **Edge anchors** — for elements that stretch in one direction only
154
155**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 range
1593. **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
1604. Set position/offset values **after** anchors and pivot are configured
161
162**Visibility checklist:**
163- Width and height are both greater than zero
164- Element is within parent bounds
165- Element is not obscured by siblings (check hierarchy order)
166- Image component has a sprite or color with alpha > 0
167
168## Common Components
169
170| 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 |
180
181## Best Practices
182
183- 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 project
185- 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
186- Organize hierarchy logically (Header, Content, Footer)
187- Use Layout Groups instead of manual positioning where possible
188- Set Raycast Target = false on non-interactive images
189- Use sprite atlases for performance
190
191**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.
192
193**Do not use** `AssetDatabase.ImportPackage()` for TMP resources, instead `TMP_PackageResourceImporter.ImportResources()` is the canonical non-interactive API.
194
195## Interaction Readiness
196
197Before completing any UI that contains interactive elements, verify:
198
1991. **EventSystem** must exist in the scene (exactly one)
2002. **GraphicRaycaster** must be on the Canvas
2013. **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 requested
203
204If the first three are missing, interactive elements will exist visually but fail silently.
205
206## Understanding
207
208When the user asks questions about existing UI:
209
210**Read the hierarchy first.** Don't assume — always inspect the scene or prefab before answering.
211
212**Analyze structure:**
213- Identify the Canvas and its render mode
214- Map the parent-child relationships
215- Identify which Layout Groups control which children
216- Check RectTransform anchor configurations
217
218**Answer questions about:**
219- "What does this button do?" → Explain component, hierarchy position, event wiring
220- "How is this laid out?" → Describe Layout Groups, anchoring, hierarchy
221- "Why is this invisible?" → Check size, anchors, parent bounds, component state
222- "What controls this element's size?" → Trace Layout Group settings or anchors
223
224## Editing
225
226For targeted changes to existing UI:
227
228**Read before editing.** Always inspect the current state first.
229
230**Edit workflow:**
2311. Verify the target object exists
2322. Identify the specific property or component to change
2333. Make the minimal change required
2344. Verify the result before proceeding
235
236**Never destroy to fix:**
237- Destroying objects cascades to null references elsewhere
238- Fix properties in place rather than recreating
239- If an element must be removed, update all references first
240
241## C# (Only When Requested)
242
243- Use fully qualified UI types to avoid namespace conflicts
244- Use `[SerializeField]` for inspector references
245- Cache component references in Awake()
246- Use events/delegates for button callbacks
247- Place scripts in same folder as prefabs (follow project patterns)
248
249**Component references:**
250- Verify referenced objects exist before accessing them
251- Handle cases where serialized references may be null
252- When wiring up references, confirm the target component is present
253
254## Error Recovery
255
256When something goes wrong:
257
258**Stop and diagnose:**
259- Identify the exact error or symptom
260- Determine the root cause before attempting fixes
261- Do not make speculative changes
262
263**Fix incrementally:**
264- Address one issue at a time
265- Verify each fix before moving to the next
266- Keep track of what was changed
267
268**Avoid destructive patterns:**
269- "Start fresh" strategies destroy working elements along with broken ones
270- Rebuilding entire hierarchies creates more problems than it solves
271- Prefer surgical fixes to wholesale replacements
272
273**When stuck:**
274- Re-verify the current state of the hierarchy
275- Check if previous changes were actually applied
276- Consider if the approach itself is wrong rather than the implementation