claude-code-arcane 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +54 -6
- package/agents/game/ue-blueprint-specialist.md +125 -0
- package/agents/game/ue-gas-specialist.md +133 -0
- package/agents/game/ue-umg-specialist.md +131 -0
- package/dist/cli.js +5 -0
- package/docs/SKILLS-CATALOG.md +42 -3
- package/docs/USER-GUIDE.md +2 -2
- package/hooks/detect-unreal.sh +90 -0
- package/package.json +1 -1
- package/profiles/unreal-dev.yaml +97 -0
- package/rules/gamedev/unreal-code.md +125 -0
- package/skills/install-mcp/SKILL.md +135 -46
- package/skills/install-mcp/references/unreal-operations.md +55 -0
- package/skills/ue-actor-component-architecture/SKILL.md +509 -0
- package/skills/ue-actor-component-architecture/references/actor-lifecycle.md +301 -0
- package/skills/ue-actor-component-architecture/references/component-types.md +592 -0
- package/skills/ue-ai-navigation/SKILL.md +526 -0
- package/skills/ue-ai-navigation/references/behavior-tree-patterns.md +392 -0
- package/skills/ue-ai-navigation/references/behavior-tree-workflow.md +107 -0
- package/skills/ue-ai-navigation/references/custom-bttask.md +104 -0
- package/skills/ue-ai-navigation/references/eqs-reference.md +423 -0
- package/skills/ue-animation-system/SKILL.md +521 -0
- package/skills/ue-animation-system/references/anim-notify-reference.md +486 -0
- package/skills/ue-animation-system/references/locomotion-setup.md +550 -0
- package/skills/ue-async-threading/SKILL.md +433 -0
- package/skills/ue-async-threading/references/thread-safety-guide.md +213 -0
- package/skills/ue-async-threading/references/threading-patterns.md +345 -0
- package/skills/ue-audio-system/SKILL.md +527 -0
- package/skills/ue-audio-system/references/audio-setup-patterns.md +700 -0
- package/skills/ue-blueprints/SKILL.md +134 -0
- package/skills/ue-blueprints/references/communication.md +82 -0
- package/skills/ue-character-movement/SKILL.md +475 -0
- package/skills/ue-character-movement/references/cmc-extension-patterns.md +335 -0
- package/skills/ue-character-movement/references/movement-pipeline.md +189 -0
- package/skills/ue-cpp-foundations/SKILL.md +533 -0
- package/skills/ue-cpp-foundations/references/components-and-gc.md +107 -0
- package/skills/ue-cpp-foundations/references/container-patterns.md +544 -0
- package/skills/ue-cpp-foundations/references/delegate-patterns.md +497 -0
- package/skills/ue-cpp-foundations/references/gameplay-classes-cpp.md +136 -0
- package/skills/ue-cpp-foundations/references/property-specifiers.md +306 -0
- package/skills/ue-data-assets-tables/SKILL.md +527 -0
- package/skills/ue-data-assets-tables/references/asset-loading-patterns.md +306 -0
- package/skills/ue-data-assets-tables/references/data-driven-design.md +378 -0
- package/skills/ue-editor-tools/SKILL.md +523 -0
- package/skills/ue-editor-tools/references/detail-customization-patterns.md +395 -0
- package/skills/ue-editor-tools/references/editor-module-setup.md +480 -0
- package/skills/ue-game-features/SKILL.md +477 -0
- package/skills/ue-game-features/references/experience-system.md +222 -0
- package/skills/ue-game-features/references/game-feature-patterns.md +308 -0
- package/skills/ue-gameplay-abilities/SKILL.md +518 -0
- package/skills/ue-gameplay-abilities/references/ability-task-reference.md +391 -0
- package/skills/ue-gameplay-abilities/references/gameplay-effect-reference.md +397 -0
- package/skills/ue-gameplay-abilities/references/gas-setup-patterns.md +369 -0
- package/skills/ue-gameplay-framework/SKILL.md +466 -0
- package/skills/ue-gameplay-framework/references/framework-class-map.md +243 -0
- package/skills/ue-input-system/SKILL.md +394 -0
- package/skills/ue-input-system/references/cpp-setup.md +131 -0
- package/skills/ue-input-system/references/enhanced-input-workflow.md +117 -0
- package/skills/ue-input-system/references/input-action-reference.md +731 -0
- package/skills/ue-mass-entity/SKILL.md +476 -0
- package/skills/ue-mass-entity/references/mass-entity-patterns.md +319 -0
- package/skills/ue-mass-entity/references/mass-fragment-reference.md +119 -0
- package/skills/ue-materials-rendering/SKILL.md +526 -0
- package/skills/ue-materials-rendering/references/material-parameter-reference.md +216 -0
- package/skills/ue-materials-rendering/references/post-process-settings.md +383 -0
- package/skills/ue-module-build-system/SKILL.md +487 -0
- package/skills/ue-module-build-system/references/build-cs-reference.md +418 -0
- package/skills/ue-module-build-system/references/common-build-errors.md +381 -0
- package/skills/ue-naming-conventions/SKILL.md +142 -0
- package/skills/ue-naming-conventions/references/asset-name-modifiers.md +233 -0
- package/skills/ue-naming-conventions/references/content-structure.md +83 -0
- package/skills/ue-networking-replication/SKILL.md +452 -0
- package/skills/ue-networking-replication/references/replication-patterns.md +526 -0
- package/skills/ue-networking-replication/references/rpc-decision-guide.md +393 -0
- package/skills/ue-niagara-effects/SKILL.md +531 -0
- package/skills/ue-niagara-effects/references/niagara-data-interfaces.md +491 -0
- package/skills/ue-niagara-effects/references/niagara-parameter-types.md +153 -0
- package/skills/ue-niagara-effects/references/niagara-workflow.md +115 -0
- package/skills/ue-packaging/SKILL.md +116 -0
- package/skills/ue-physics-collision/SKILL.md +423 -0
- package/skills/ue-physics-collision/references/collision-channel-setup.md +218 -0
- package/skills/ue-physics-collision/references/trace-patterns.md +499 -0
- package/skills/ue-procedural-generation/SKILL.md +505 -0
- package/skills/ue-procedural-generation/references/pcg-node-reference.md +381 -0
- package/skills/ue-procedural-generation/references/procedural-mesh-patterns.md +940 -0
- package/skills/ue-project-context/SKILL.md +305 -0
- package/skills/ue-sequencer-cinematics/SKILL.md +506 -0
- package/skills/ue-sequencer-cinematics/references/sequencer-patterns.md +629 -0
- package/skills/ue-serialization-savegames/SKILL.md +524 -0
- package/skills/ue-serialization-savegames/references/save-system-architecture.md +705 -0
- package/skills/ue-state-trees/SKILL.md +489 -0
- package/skills/ue-state-trees/references/state-tree-mass-integration.md +184 -0
- package/skills/ue-state-trees/references/state-tree-patterns.md +321 -0
- package/skills/ue-testing-debugging/SKILL.md +520 -0
- package/skills/ue-testing-debugging/references/automation-test-patterns.md +387 -0
- package/skills/ue-testing-debugging/references/profiling-commands.md +357 -0
- package/skills/ue-ui-umg-slate/SKILL.md +431 -0
- package/skills/ue-ui-umg-slate/references/common-ui-setup.md +484 -0
- package/skills/ue-ui-umg-slate/references/widget-types.md +487 -0
- package/skills/ue-world-level-streaming/SKILL.md +518 -0
- package/skills/ue-world-level-streaming/references/streaming-patterns.md +414 -0
- package/templates/gamedev/unreal-project-context.md +107 -0
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
# UMG Widget Type Reference
|
|
2
|
+
|
|
3
|
+
> Source: `Engine/Source/Runtime/UMG/Public/Components/`
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## UButton
|
|
8
|
+
|
|
9
|
+
**Header:** `Components/Button.h`
|
|
10
|
+
**Base class:** `UContentWidget` (single child slot)
|
|
11
|
+
**Slate backing:** `SButton`
|
|
12
|
+
|
|
13
|
+
### Key Delegates (BlueprintAssignable)
|
|
14
|
+
|
|
15
|
+
| Delegate | Type | Description |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| `OnClicked` | `FOnButtonClickedEvent` | Mouse release after press (default DownAndUp) |
|
|
18
|
+
| `OnPressed` | `FOnButtonPressedEvent` | Mouse/key press begins |
|
|
19
|
+
| `OnReleased` | `FOnButtonReleasedEvent` | Mouse/key released |
|
|
20
|
+
| `OnHovered` | `FOnButtonHoverEvent` | Cursor enters bounds |
|
|
21
|
+
| `OnUnhovered` | `FOnButtonHoverEvent` | Cursor leaves bounds |
|
|
22
|
+
|
|
23
|
+
### Key Methods
|
|
24
|
+
|
|
25
|
+
```cpp
|
|
26
|
+
void SetStyle(const FButtonStyle& InStyle);
|
|
27
|
+
const FButtonStyle& GetStyle() const;
|
|
28
|
+
void SetColorAndOpacity(FLinearColor InColorAndOpacity);
|
|
29
|
+
FLinearColor GetColorAndOpacity() const;
|
|
30
|
+
void SetBackgroundColor(FLinearColor InBackgroundColor);
|
|
31
|
+
FLinearColor GetBackgroundColor() const;
|
|
32
|
+
bool IsPressed() const;
|
|
33
|
+
void SetClickMethod(EButtonClickMethod::Type InClickMethod);
|
|
34
|
+
void SetTouchMethod(EButtonTouchMethod::Type InTouchMethod);
|
|
35
|
+
void SetPressMethod(EButtonPressMethod::Type InPressMethod);
|
|
36
|
+
void SetAllowDragDrop(bool bInAllowDragDrop);
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Click Methods
|
|
40
|
+
|
|
41
|
+
| `EButtonClickMethod` | Behavior |
|
|
42
|
+
|---|---|
|
|
43
|
+
| `DownAndUp` | Default. Click fires on mouse up after mouse down. |
|
|
44
|
+
| `MouseDown` | Fires immediately on mouse down. |
|
|
45
|
+
| `MouseUp` | Fires on mouse up regardless of where mouse down was. |
|
|
46
|
+
| `PreciseClick` | Fires on mouse up only if cursor is still over the button. |
|
|
47
|
+
|
|
48
|
+
### UE5.2+ Deprecation Note
|
|
49
|
+
|
|
50
|
+
Direct property access (`WidgetStyle`, `ColorAndOpacity`, `BackgroundColor`, `ClickMethod`, `TouchMethod`, `PressMethod`, `IsFocusable`) is deprecated. Use the getter/setter methods above.
|
|
51
|
+
|
|
52
|
+
### BindWidget Example
|
|
53
|
+
|
|
54
|
+
```cpp
|
|
55
|
+
UPROPERTY(meta=(BindWidget))
|
|
56
|
+
TObjectPtr<UButton> ConfirmButton;
|
|
57
|
+
|
|
58
|
+
// In NativeConstruct:
|
|
59
|
+
ConfirmButton->OnClicked.AddDynamic(this, &UMyWidget::HandleConfirm);
|
|
60
|
+
ConfirmButton->SetColorAndOpacity(FLinearColor(0.2f, 0.8f, 0.2f, 1.f));
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## UTextBlock
|
|
66
|
+
|
|
67
|
+
**Header:** `Components/TextBlock.h`
|
|
68
|
+
**Base class:** `UTextLayoutWidget`
|
|
69
|
+
**Slate backing:** `STextBlock`
|
|
70
|
+
|
|
71
|
+
### Key Properties (use setters in UE5.1+)
|
|
72
|
+
|
|
73
|
+
| Property | Type | Description |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| `Text` | `FText` | Displayed text |
|
|
76
|
+
| `Font` | `FSlateFontInfo` | Font, size, typeface |
|
|
77
|
+
| `ColorAndOpacity` | `FSlateColor` | Text color |
|
|
78
|
+
| `ShadowOffset` | `FVector2D` | Drop shadow offset |
|
|
79
|
+
| `ShadowColorAndOpacity` | `FLinearColor` | Drop shadow color |
|
|
80
|
+
| `MinDesiredWidth` | `float` | Minimum widget width |
|
|
81
|
+
| `TextTransformPolicy` | `ETextTransformPolicy` | None, ToLower, ToUpper |
|
|
82
|
+
| `TextOverflowPolicy` | `ETextOverflowPolicy` | Clip, Ellipsis, MultilineEllipsis |
|
|
83
|
+
| `bSimpleTextMode` | `bool` | Fast path for ASCII/numeric text |
|
|
84
|
+
|
|
85
|
+
### Key Methods
|
|
86
|
+
|
|
87
|
+
```cpp
|
|
88
|
+
FText GetText() const;
|
|
89
|
+
void SetText(FText InText); // Wipes Blueprint binding!
|
|
90
|
+
void SetColorAndOpacity(FSlateColor InColorAndOpacity);
|
|
91
|
+
void SetOpacity(float InOpacity);
|
|
92
|
+
void SetShadowColorAndOpacity(FLinearColor InShadowColorAndOpacity);
|
|
93
|
+
void SetShadowOffset(FVector2D InShadowOffset);
|
|
94
|
+
void SetFont(FSlateFontInfo InFontInfo);
|
|
95
|
+
void SetStrikeBrush(FSlateBrush InStrikeBrush);
|
|
96
|
+
void SetMinDesiredWidth(float InMinDesiredWidth);
|
|
97
|
+
void SetAutoWrapText(bool InAutoTextWrap);
|
|
98
|
+
void SetTextTransformPolicy(ETextTransformPolicy InTransformPolicy);
|
|
99
|
+
void SetTextOverflowPolicy(ETextOverflowPolicy InOverflowPolicy);
|
|
100
|
+
void SetFontMaterial(UMaterialInterface* InMaterial);
|
|
101
|
+
void SetFontOutlineMaterial(UMaterialInterface* InMaterial);
|
|
102
|
+
UMaterialInstanceDynamic* GetDynamicFontMaterial();
|
|
103
|
+
UMaterialInstanceDynamic* GetDynamicOutlineMaterial();
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Common Patterns
|
|
107
|
+
|
|
108
|
+
```cpp
|
|
109
|
+
// Simple string (avoid — prefer FText for localization)
|
|
110
|
+
ScoreLabel->SetText(FText::FromString(TEXT("Score: 100")));
|
|
111
|
+
|
|
112
|
+
// Localized with format argument
|
|
113
|
+
ScoreLabel->SetText(FText::Format(
|
|
114
|
+
NSLOCTEXT("HUD", "ScoreFmt", "Score: {0}"),
|
|
115
|
+
FText::AsNumber(Score)));
|
|
116
|
+
|
|
117
|
+
// Number with grouping (e.g., "1,234,567")
|
|
118
|
+
ScoreLabel->SetText(FText::AsNumber(Score));
|
|
119
|
+
|
|
120
|
+
// Uppercase transform
|
|
121
|
+
ScoreLabel->SetTextTransformPolicy(ETextTransformPolicy::ToUpper);
|
|
122
|
+
|
|
123
|
+
// Ellipsis for overflow
|
|
124
|
+
ScoreLabel->SetTextOverflowPolicy(ETextOverflowPolicy::Ellipsis);
|
|
125
|
+
|
|
126
|
+
// Font from content
|
|
127
|
+
FSlateFontInfo FontInfo = FCoreStyle::GetDefaultFont();
|
|
128
|
+
FontInfo.Size = 32;
|
|
129
|
+
ScoreLabel->SetFont(FontInfo);
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## UImage
|
|
135
|
+
|
|
136
|
+
**Header:** `Components/Image.h`
|
|
137
|
+
**Base class:** `UWidget` (no children)
|
|
138
|
+
**Slate backing:** `SImage`
|
|
139
|
+
|
|
140
|
+
### Key Properties
|
|
141
|
+
|
|
142
|
+
| Property | Type | Description |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| `Brush` | `FSlateBrush` | The image resource and drawing settings |
|
|
145
|
+
| `ColorAndOpacity` | `FLinearColor` | Tint applied to the image |
|
|
146
|
+
| `bFlipForRightToLeftFlowDirection` | `bool` | RTL localization support |
|
|
147
|
+
|
|
148
|
+
### Key Methods
|
|
149
|
+
|
|
150
|
+
```cpp
|
|
151
|
+
void SetColorAndOpacity(FLinearColor InColorAndOpacity);
|
|
152
|
+
void SetOpacity(float InOpacity);
|
|
153
|
+
void SetBrush(const FSlateBrush& InBrush);
|
|
154
|
+
const FSlateBrush& GetBrush() const;
|
|
155
|
+
void SetBrushFromAsset(USlateBrushAsset* Asset);
|
|
156
|
+
void SetBrushFromTexture(UTexture2D* Texture, bool bMatchSize = false);
|
|
157
|
+
void SetBrushFromTextureDynamic(UTexture2DDynamic* Texture, bool bMatchSize = false);
|
|
158
|
+
void SetBrushFromMaterial(UMaterialInterface* Material);
|
|
159
|
+
void SetBrushFromSoftTexture(TSoftObjectPtr<UTexture2D> SoftTexture, bool bMatchSize = false);
|
|
160
|
+
void SetBrushFromSoftMaterial(TSoftObjectPtr<UMaterialInterface> SoftMaterial);
|
|
161
|
+
void SetBrushFromAtlasInterface(TScriptInterface<ISlateTextureAtlasInterface> AtlasRegion, bool bMatchSize = false);
|
|
162
|
+
void SetDesiredSizeOverride(FVector2D DesiredSize);
|
|
163
|
+
void SetBrushTintColor(FSlateColor TintColor);
|
|
164
|
+
void SetBrushResourceObject(UObject* ResourceObject);
|
|
165
|
+
UMaterialInstanceDynamic* GetDynamicMaterial();
|
|
166
|
+
void SetFlipForRightToLeftFlowDirection(bool bFlip);
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Common Patterns
|
|
170
|
+
|
|
171
|
+
```cpp
|
|
172
|
+
// Static texture
|
|
173
|
+
AvatarImage->SetBrushFromTexture(LoadObject<UTexture2D>(nullptr, TEXT("/Game/UI/T_Avatar")));
|
|
174
|
+
|
|
175
|
+
// Material instance dynamic for animation or parameters
|
|
176
|
+
AvatarImage->SetBrushFromMaterial(AvatarMaterial);
|
|
177
|
+
UMaterialInstanceDynamic* MID = AvatarImage->GetDynamicMaterial();
|
|
178
|
+
MID->SetScalarParameterValue(TEXT("GlowIntensity"), 1.5f);
|
|
179
|
+
MID->SetVectorParameterValue(TEXT("Tint"), FLinearColor::Yellow);
|
|
180
|
+
|
|
181
|
+
// Async stream from soft pointer (no blocking load)
|
|
182
|
+
AvatarImage->SetBrushFromSoftTexture(SoftAvatarTexture, /*bMatchSize=*/true);
|
|
183
|
+
|
|
184
|
+
// Size override
|
|
185
|
+
AvatarImage->SetDesiredSizeOverride(FVector2D(64.f, 64.f));
|
|
186
|
+
|
|
187
|
+
// Tint without touching the brush
|
|
188
|
+
AvatarImage->SetColorAndOpacity(FLinearColor(1.f, 0.5f, 0.5f, 1.f));
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## UProgressBar
|
|
194
|
+
|
|
195
|
+
**Header:** `Components/ProgressBar.h`
|
|
196
|
+
**Base class:** `UWidget` (no children)
|
|
197
|
+
**Slate backing:** `SProgressBar`
|
|
198
|
+
|
|
199
|
+
### Key Properties
|
|
200
|
+
|
|
201
|
+
| Property | Type | Description |
|
|
202
|
+
|---|---|---|
|
|
203
|
+
| `Percent` | `float` | Fill value 0.0–1.0 |
|
|
204
|
+
| `BarFillType` | `EProgressBarFillType` | LeftToRight, RightToLeft, FillFromCenter, etc. |
|
|
205
|
+
| `BarFillStyle` | `EProgressBarFillStyle` | Scale or Mask |
|
|
206
|
+
| `bIsMarquee` | `bool` | Indeterminate animation |
|
|
207
|
+
| `FillColorAndOpacity` | `FLinearColor` | Fill color |
|
|
208
|
+
|
|
209
|
+
### Key Methods
|
|
210
|
+
|
|
211
|
+
```cpp
|
|
212
|
+
float GetPercent() const;
|
|
213
|
+
void SetPercent(float InPercent); // Primary runtime update
|
|
214
|
+
void SetFillColorAndOpacity(FLinearColor InColor);
|
|
215
|
+
FLinearColor GetFillColorAndOpacity() const;
|
|
216
|
+
void SetIsMarquee(bool InbIsMarquee);
|
|
217
|
+
bool UseMarquee() const;
|
|
218
|
+
void SetBarFillType(EProgressBarFillType::Type InBarFillType);
|
|
219
|
+
void SetBarFillStyle(EProgressBarFillStyle::Type InBarFillStyle);
|
|
220
|
+
void SetBorderPadding(FVector2D InBorderPadding);
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Fill Types
|
|
224
|
+
|
|
225
|
+
| `EProgressBarFillType` | Description |
|
|
226
|
+
|---|---|
|
|
227
|
+
| `LeftToRight` | Default, fills left to right |
|
|
228
|
+
| `RightToLeft` | Fills right to left |
|
|
229
|
+
| `FillFromCenter` | Fills outward from center (vertical) |
|
|
230
|
+
| `FillFromCenterHorizontal` | Fills outward from center (horizontal) |
|
|
231
|
+
| `FillFromCenterVertical` | Fills up/down from vertical center |
|
|
232
|
+
| `TopToBottom` | Fills top to bottom |
|
|
233
|
+
| `BottomToTop` | Fills bottom to top |
|
|
234
|
+
|
|
235
|
+
### Common Patterns
|
|
236
|
+
|
|
237
|
+
```cpp
|
|
238
|
+
// Health bar
|
|
239
|
+
HealthBar->SetPercent(Health / MaxHealth);
|
|
240
|
+
HealthBar->SetFillColorAndOpacity(Health > MaxHealth * 0.3f
|
|
241
|
+
? FLinearColor(0.f, 0.8f, 0.f, 1.f) // Green
|
|
242
|
+
: FLinearColor(0.9f, 0.1f, 0.f, 1.f));// Red
|
|
243
|
+
|
|
244
|
+
// Loading spinner (marquee)
|
|
245
|
+
LoadingBar->SetIsMarquee(true);
|
|
246
|
+
|
|
247
|
+
// Experience bar filling right-to-left
|
|
248
|
+
XPBar->SetBarFillType(EProgressBarFillType::LeftToRight);
|
|
249
|
+
XPBar->SetPercent(XP / XPToNextLevel);
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## UListView
|
|
255
|
+
|
|
256
|
+
**Header:** `Components/ListView.h`
|
|
257
|
+
**Base class:** `UListViewBase`, `ITypedUMGListView<UObject*>`
|
|
258
|
+
**Slate backing:** `SListView<UObject*>`
|
|
259
|
+
|
|
260
|
+
The list is virtualized: only visible entry widgets exist. Items are data objects; entry widgets are reused as the list scrolls.
|
|
261
|
+
|
|
262
|
+
### Key Delegates
|
|
263
|
+
|
|
264
|
+
| Delegate | Signature | Description |
|
|
265
|
+
|---|---|---|
|
|
266
|
+
| `BP_OnItemClicked` | `(UObject* Item)` | Item clicked |
|
|
267
|
+
| `BP_OnItemDoubleClicked` | `(UObject* Item)` | Item double-clicked |
|
|
268
|
+
| `BP_OnItemSelectionChanged` | `(UObject* Item, bool bIsSelected)` | Selection changed |
|
|
269
|
+
| `BP_OnEntryInitialized` | `(UObject* Item, UUserWidget* Widget)` | Entry widget assigned |
|
|
270
|
+
| `BP_OnItemScrolledIntoView` | `(UObject* Item, UUserWidget* Widget)` | Item scrolled visible |
|
|
271
|
+
|
|
272
|
+
### Key Methods
|
|
273
|
+
|
|
274
|
+
```cpp
|
|
275
|
+
// Add / remove items
|
|
276
|
+
void AddItem(UObject* Item);
|
|
277
|
+
void RemoveItem(UObject* Item);
|
|
278
|
+
void ClearListItems();
|
|
279
|
+
void SetListItems(const TArray<ItemObjectT, AllocatorType>& InListItems); // Template
|
|
280
|
+
|
|
281
|
+
// Query
|
|
282
|
+
const TArray<UObject*>& GetListItems() const;
|
|
283
|
+
UObject* GetItemAt(int32 Index) const;
|
|
284
|
+
int32 GetNumItems() const;
|
|
285
|
+
int32 GetIndexForItem(const UObject* Item) const;
|
|
286
|
+
bool IsRefreshPending() const;
|
|
287
|
+
|
|
288
|
+
// Selection (single-selection recommended for GetSelectedItem)
|
|
289
|
+
void SetSelectedItem(const UObject* Item);
|
|
290
|
+
void SetSelectedIndex(int32 Index);
|
|
291
|
+
UObject* GetSelectedItem() const; // Template: GetSelectedItem<UMyData>()
|
|
292
|
+
bool BP_GetSelectedItems(TArray<UObject*>& Items) const;
|
|
293
|
+
int32 BP_GetNumItemsSelected() const;
|
|
294
|
+
void BP_ClearSelection();
|
|
295
|
+
void SetSelectionMode(TEnumAsByte<ESelectionMode::Type> SelectionMode);
|
|
296
|
+
|
|
297
|
+
// Navigation and scrolling
|
|
298
|
+
void ScrollIndexIntoView(int32 Index);
|
|
299
|
+
void NavigateToIndex(int32 Index);
|
|
300
|
+
void BP_ScrollItemIntoView(UObject* Item);
|
|
301
|
+
void BP_NavigateToItem(UObject* Item);
|
|
302
|
+
bool BP_IsItemVisible(UObject* Item) const;
|
|
303
|
+
|
|
304
|
+
// Entry widget retrieval (only valid when the entry is visible)
|
|
305
|
+
RowWidgetT* GetEntryWidgetFromItem(const UObject* Item) const; // Template
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### IUserObjectListEntry (entry widget interface)
|
|
309
|
+
|
|
310
|
+
```cpp
|
|
311
|
+
// Entry widget header:
|
|
312
|
+
UCLASS()
|
|
313
|
+
class UMyEntryWidget : public UUserWidget, public IUserObjectListEntry
|
|
314
|
+
{
|
|
315
|
+
GENERATED_BODY()
|
|
316
|
+
protected:
|
|
317
|
+
// Implement this — called each time the entry is assigned a new item object
|
|
318
|
+
virtual void NativeOnListItemObjectSet(UObject* ListItemObject) override;
|
|
319
|
+
|
|
320
|
+
// IUserListEntry helpers (from parent interface):
|
|
321
|
+
// bool IsItemSelected() const;
|
|
322
|
+
// bool IsItemExpanded() const; // TreeView only
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
// Access the assigned item from within the entry widget:
|
|
326
|
+
UMyData* Data = GetListItem<UMyData>();
|
|
327
|
+
|
|
328
|
+
// Static helpers (BlueprintCallable via UUserObjectListEntryLibrary):
|
|
329
|
+
// UObject* GetListItemObject(...)
|
|
330
|
+
// int32 GetListItemIndex(...)
|
|
331
|
+
// bool IsFirstWidget(...)
|
|
332
|
+
// bool IsLastWidget(...)
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### UTileView
|
|
336
|
+
|
|
337
|
+
Works identically to `UListView` but arranges entries in a 2D grid. Entry height is set on the `UTileView`. Uses the same `IUserObjectListEntry` interface.
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## UScrollBox
|
|
342
|
+
|
|
343
|
+
**Header:** `Components/ScrollBox.h`
|
|
344
|
+
**Base class:** `UPanelWidget` (multiple children)
|
|
345
|
+
|
|
346
|
+
```cpp
|
|
347
|
+
// Programmatic scroll
|
|
348
|
+
MyScrollBox->ScrollToStart();
|
|
349
|
+
MyScrollBox->ScrollToEnd();
|
|
350
|
+
MyScrollBox->ScrollWidgetIntoView(ChildWidget, /*bAnimateScroll=*/true);
|
|
351
|
+
MyScrollBox->SetScrollOffset(200.f);
|
|
352
|
+
float Offset = MyScrollBox->GetScrollOffset();
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
## UWidgetSwitcher
|
|
358
|
+
|
|
359
|
+
**Header:** `Components/WidgetSwitcher.h`
|
|
360
|
+
|
|
361
|
+
```cpp
|
|
362
|
+
// Only one child is visible at a time (zero-based index)
|
|
363
|
+
MySwitcher->SetActiveWidgetIndex(1);
|
|
364
|
+
MySwitcher->SetActiveWidget(MyChildWidget);
|
|
365
|
+
int32 Index = MySwitcher->GetActiveWidgetIndex();
|
|
366
|
+
UWidget* Active = MySwitcher->GetActiveWidget();
|
|
367
|
+
int32 Count = MySwitcher->GetNumWidgets();
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
## UCheckBox
|
|
373
|
+
|
|
374
|
+
```cpp
|
|
375
|
+
// State
|
|
376
|
+
bool bChecked = MyCheckBox->IsChecked();
|
|
377
|
+
MyCheckBox->SetIsChecked(true);
|
|
378
|
+
ECheckBoxState State = MyCheckBox->GetCheckedState();
|
|
379
|
+
// ECheckBoxState: Unchecked, Checked, Undetermined
|
|
380
|
+
|
|
381
|
+
// Delegate
|
|
382
|
+
MyCheckBox->OnCheckStateChanged.AddDynamic(this, &UMyWidget::HandleCheckChanged);
|
|
383
|
+
// Signature: void HandleCheckChanged(bool bIsChecked)
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## UEditableTextBox
|
|
389
|
+
|
|
390
|
+
```cpp
|
|
391
|
+
FText Text = MyInput->GetText();
|
|
392
|
+
MyInput->SetText(FText::FromString(TEXT("Default")));
|
|
393
|
+
MyInput->SetHintText(NSLOCTEXT("UI", "SearchHint", "Search..."));
|
|
394
|
+
MyInput->SetIsReadOnly(true);
|
|
395
|
+
MyInput->SetIsPassword(true); // Mask characters
|
|
396
|
+
|
|
397
|
+
// Delegates
|
|
398
|
+
MyInput->OnTextChanged.AddDynamic(this, &UMyWidget::HandleTextChanged);
|
|
399
|
+
MyInput->OnTextCommitted.AddDynamic(this, &UMyWidget::HandleTextCommitted);
|
|
400
|
+
// Committed signature: void(const FText& Text, ETextCommit::Type CommitMethod)
|
|
401
|
+
// ETextCommit: OnEnter, OnUserMovedFocus, OnCleared, Default
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## USlider
|
|
407
|
+
|
|
408
|
+
```cpp
|
|
409
|
+
float Value = MySlider->GetValue(); // 0.0 – 1.0
|
|
410
|
+
MySlider->SetValue(0.5f);
|
|
411
|
+
MySlider->SetMinValue(0.f);
|
|
412
|
+
MySlider->SetMaxValue(100.f);
|
|
413
|
+
MySlider->SetStepSize(1.f);
|
|
414
|
+
MySlider->SetOrientation(EOrientation::Orient_Horizontal);
|
|
415
|
+
|
|
416
|
+
MySlider->OnValueChanged.AddDynamic(this, &UMyWidget::HandleSliderChanged);
|
|
417
|
+
// Signature: void(float Value)
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
## UComboBoxString
|
|
423
|
+
|
|
424
|
+
```cpp
|
|
425
|
+
MyCombo->AddOption(TEXT("Option A"));
|
|
426
|
+
MyCombo->AddOption(TEXT("Option B"));
|
|
427
|
+
MyCombo->SetSelectedOption(TEXT("Option A"));
|
|
428
|
+
FString Selected = MyCombo->GetSelectedOption();
|
|
429
|
+
int32 Count = MyCombo->GetOptionCount();
|
|
430
|
+
MyCombo->ClearOptions();
|
|
431
|
+
MyCombo->RefreshOptions();
|
|
432
|
+
|
|
433
|
+
MyCombo->OnSelectionChanged.AddDynamic(this, &UMyWidget::HandleComboChanged);
|
|
434
|
+
// Signature: void(FString SelectedItem, ESelectInfo::Type SelectionType)
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## Visibility Reference
|
|
440
|
+
|
|
441
|
+
| `ESlateVisibility` | Rendered | Takes Space | Receives Input |
|
|
442
|
+
|---|---|---|---|
|
|
443
|
+
| `Visible` | Yes | Yes | Yes |
|
|
444
|
+
| `Collapsed` | No | No | No |
|
|
445
|
+
| `Hidden` | No | Yes | No |
|
|
446
|
+
| `HitTestInvisible` | Yes | Yes | No (passes through) |
|
|
447
|
+
| `SelfHitTestInvisible` | Yes | Yes | Children only |
|
|
448
|
+
|
|
449
|
+
```cpp
|
|
450
|
+
Widget->SetVisibility(ESlateVisibility::Collapsed);
|
|
451
|
+
ESlateVisibility V = Widget->GetVisibility();
|
|
452
|
+
bool bVisible = V == ESlateVisibility::Visible;
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
---
|
|
456
|
+
|
|
457
|
+
## UWidget Base (All Widgets)
|
|
458
|
+
|
|
459
|
+
All UMG widgets inherit from `UWidget`:
|
|
460
|
+
|
|
461
|
+
```cpp
|
|
462
|
+
// Enable/disable (grays out and blocks input)
|
|
463
|
+
Widget->SetIsEnabled(false);
|
|
464
|
+
bool bEnabled = Widget->GetIsEnabled();
|
|
465
|
+
|
|
466
|
+
// Render opacity (does not affect layout or hit testing)
|
|
467
|
+
Widget->SetRenderOpacity(0.5f);
|
|
468
|
+
float Opacity = Widget->GetRenderOpacity();
|
|
469
|
+
|
|
470
|
+
// Transform (applied as render transform, not layout)
|
|
471
|
+
Widget->SetRenderTransformAngle(45.f);
|
|
472
|
+
Widget->SetRenderTranslation(FVector2D(10.f, 0.f));
|
|
473
|
+
Widget->SetRenderScale(FVector2D(1.2f, 1.2f));
|
|
474
|
+
|
|
475
|
+
// Tooltip
|
|
476
|
+
Widget->SetToolTipText(NSLOCTEXT("UI", "Tip", "Click to confirm"));
|
|
477
|
+
|
|
478
|
+
// Cursor
|
|
479
|
+
Widget->SetCursor(EMouseCursor::Hand);
|
|
480
|
+
|
|
481
|
+
// Focus
|
|
482
|
+
Widget->SetKeyboardFocus();
|
|
483
|
+
bool bHasFocus = Widget->HasKeyboardFocus();
|
|
484
|
+
|
|
485
|
+
// Slate widget access (for Slate-only APIs)
|
|
486
|
+
TSharedPtr<SWidget> SlateWidget = Widget->GetCachedWidget();
|
|
487
|
+
```
|