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,381 @@
|
|
|
1
|
+
# Common UE Build Errors: Causes and Solutions
|
|
2
|
+
|
|
3
|
+
This reference maps common Unreal Build Tool (UBT) and compiler/linker error messages to their root causes and concrete fixes.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Linker Errors (LNK)
|
|
8
|
+
|
|
9
|
+
### LNK2019 — Unresolved External Symbol
|
|
10
|
+
|
|
11
|
+
**Full message pattern**:
|
|
12
|
+
```
|
|
13
|
+
error LNK2019: unresolved external symbol "public: void __cdecl FSomeClass::SomeMethod(void)"
|
|
14
|
+
referenced in function "..."
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**Cause A: Missing module dependency**
|
|
18
|
+
|
|
19
|
+
The module containing `FSomeClass` is not listed as a dependency.
|
|
20
|
+
|
|
21
|
+
Fix: Add the module to `Build.cs`:
|
|
22
|
+
```csharp
|
|
23
|
+
PrivateDependencyModuleNames.Add("TheModuleThatDefinesFSomeClass");
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Cause B: Missing `MODULENAME_API` export macro**
|
|
27
|
+
|
|
28
|
+
`FSomeClass` exists in another module but was never marked for DLL export.
|
|
29
|
+
|
|
30
|
+
Fix: Add the macro to the class or function declaration:
|
|
31
|
+
```cpp
|
|
32
|
+
// Before:
|
|
33
|
+
class FSomeClass { void SomeMethod(); };
|
|
34
|
+
|
|
35
|
+
// After:
|
|
36
|
+
class MYMODULE_API FSomeClass { void SomeMethod(); };
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Cause C: Function defined in a .cpp but declared in a header without the macro**
|
|
40
|
+
|
|
41
|
+
```cpp
|
|
42
|
+
// Header — export the declaration
|
|
43
|
+
MYMODULE_API void SomeFreeFunction();
|
|
44
|
+
|
|
45
|
+
// .cpp — no macro needed here, definition is in the same module
|
|
46
|
+
void SomeFreeFunction() { ... }
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Cause D: Dependency listed in PrivateDependencyModuleNames but type appears in a public header**
|
|
50
|
+
|
|
51
|
+
A type from a private dependency cannot be used in your public headers. Either:
|
|
52
|
+
- Move the type usage to your Private/ .cpp files, OR
|
|
53
|
+
- Promote the dependency to `PublicDependencyModuleNames`
|
|
54
|
+
|
|
55
|
+
### LNK2001 — Unresolved External Symbol (variant)
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
error LNK2001: unresolved external symbol __declspec(dllimport) ...
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
This is the same problem as LNK2019. Follow the same fixes.
|
|
62
|
+
|
|
63
|
+
### LNK4099 — PDB Not Found
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
warning LNK4099: PDB 'SomeLib.pdb' was not found
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Usually harmless for third-party libraries. Suppress with a linker flag in Build.cs:
|
|
70
|
+
```csharp
|
|
71
|
+
// Suppress PDB warnings for external libraries
|
|
72
|
+
PublicAdditionalLibraries can omit .pdb — or suppress via:
|
|
73
|
+
// bDisableSymbolLocalization = true (or ignore in project linker settings)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### LNK1104 — Cannot Open File
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
fatal error LNK1104: cannot open file 'SomeLib.lib'
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Cause**: A library path in `PublicAdditionalLibraries` points to a file that doesn't exist.
|
|
83
|
+
|
|
84
|
+
**Fix**: Verify the path. Use `Path.Combine` to build platform-correct paths:
|
|
85
|
+
```csharp
|
|
86
|
+
string LibPath = Path.Combine(ModuleDirectory, "lib", "Win64", "SomeLib.lib");
|
|
87
|
+
if (File.Exists(LibPath))
|
|
88
|
+
{
|
|
89
|
+
PublicAdditionalLibraries.Add(LibPath);
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Compiler Errors (C-series, clang)
|
|
96
|
+
|
|
97
|
+
### C1083 — Cannot Open Include File
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
fatal error C1083: Cannot open include file: 'SomeHeader.h': No such file or directory
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Cause A: Missing module dependency**
|
|
104
|
+
|
|
105
|
+
The module that owns `SomeHeader.h` is not a dependency.
|
|
106
|
+
|
|
107
|
+
Fix:
|
|
108
|
+
```csharp
|
|
109
|
+
PublicDependencyModuleNames.Add("TheModuleThatOwnsSomeHeader");
|
|
110
|
+
// or
|
|
111
|
+
PrivateDependencyModuleNames.Add("TheModuleThatOwnsSomeHeader");
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Cause B: Wrong include path in IWYU mode**
|
|
115
|
+
|
|
116
|
+
UE5 with `PCHUsage = UseExplicitOrSharedPCHs` requires full paths relative to a module's `Public/` root.
|
|
117
|
+
|
|
118
|
+
```cpp
|
|
119
|
+
// Wrong — works only if PCH pulls it in transitively
|
|
120
|
+
#include "Actor.h"
|
|
121
|
+
|
|
122
|
+
// Correct — explicit path from module root
|
|
123
|
+
#include "GameFramework/Actor.h"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Cause C: Third-party header not on include path**
|
|
127
|
+
|
|
128
|
+
```csharp
|
|
129
|
+
// In Build.cs:
|
|
130
|
+
PublicSystemIncludePaths.Add(Path.Combine(ThirdPartyDir, "include"));
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Cause D: Missing header generated by UHT**
|
|
134
|
+
|
|
135
|
+
If the included file is a `.generated.h`, you may need to regenerate project files. Run "Generate Project Files" from the .uproject or from the Unreal Editor.
|
|
136
|
+
|
|
137
|
+
### C2039 — Member Not Found
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
error C2039: 'SomeMember': is not a member of 'FSomeClass'
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Often caused by:
|
|
144
|
+
- Stale generated header (`.generated.h`) — regenerate project files
|
|
145
|
+
- Forward declaration without full include — add `#include "SomeClass.h"` in the .cpp
|
|
146
|
+
- IWYU violation — the type was previously pulled in by a PCH header that's no longer included
|
|
147
|
+
|
|
148
|
+
### C2027 / C2371 — Incomplete Type / Type Redefinition
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
error C2027: use of undefined type 'FSomeClass'
|
|
152
|
+
error C2371: 'FSomeClass': redefinition; different basic types
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Cause**: Forward declaration used where full definition is needed, OR the same header included via two different paths (`SomeClass.h` vs `SubDir/SomeClass.h`).
|
|
156
|
+
|
|
157
|
+
**Fix for incomplete type**: Replace forward declaration with full include in the .cpp:
|
|
158
|
+
```cpp
|
|
159
|
+
// Header — keep forward declaration for pointer/reference params
|
|
160
|
+
class FSomeClass;
|
|
161
|
+
class MYMODULE_API FMyClass
|
|
162
|
+
{
|
|
163
|
+
void DoThing(FSomeClass* Param);
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
// CPP — include the full definition
|
|
167
|
+
#include "SomeClass.h"
|
|
168
|
+
void FMyClass::DoThing(FSomeClass* Param) { ... }
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Fix for redefinition**: Use consistent paths. Prefer includes from a module root:
|
|
172
|
+
```cpp
|
|
173
|
+
// Inconsistent — may cause ODR violations
|
|
174
|
+
#include "SomeClass.h" // resolved via PublicIncludePaths
|
|
175
|
+
#include "SubDir/SomeClass.h" // different resolved path, same file
|
|
176
|
+
|
|
177
|
+
// Consistent — always use full path from module root
|
|
178
|
+
#include "SubDir/SomeClass.h"
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## UHT Errors (Unreal Header Tool)
|
|
184
|
+
|
|
185
|
+
### Missing #include for generated header
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
error: include 'MyClass.generated.h' must be the last include in the header
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**Fix**: Move the `.generated.h` include to the very last line of your header's includes:
|
|
192
|
+
```cpp
|
|
193
|
+
#pragma once
|
|
194
|
+
|
|
195
|
+
#include "CoreMinimal.h"
|
|
196
|
+
#include "GameFramework/Actor.h"
|
|
197
|
+
#include "MyClass.generated.h" // MUST be last
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### UCLASS / USTRUCT not found by UHT
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
error: Expected type name after 'class' keyword
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Common causes:
|
|
207
|
+
- The file is in the wrong directory (UHT only scans `Public/` and `Private/`)
|
|
208
|
+
- The file is not listed in the project (ensure .uproject or .uplugin has the module)
|
|
209
|
+
- `GENERATED_BODY()` or `GENERATED_USTRUCT_BODY()` is missing inside the class/struct
|
|
210
|
+
|
|
211
|
+
### Missing MODULE_API on exported UCLASS
|
|
212
|
+
|
|
213
|
+
UHT-generated reflection requires that classes with `UCLASS()` macro are exported if they're in a module:
|
|
214
|
+
|
|
215
|
+
```cpp
|
|
216
|
+
UCLASS()
|
|
217
|
+
class MYMODULE_API UMyObject : public UObject
|
|
218
|
+
{
|
|
219
|
+
GENERATED_BODY()
|
|
220
|
+
// ...
|
|
221
|
+
};
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Omitting `MYMODULE_API` here will compile but causes reflection failures when the class is referenced across module boundaries.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## IWYU Violations
|
|
229
|
+
|
|
230
|
+
### Symptom: Builds in unity mode, fails with standalone compile
|
|
231
|
+
|
|
232
|
+
With `bUseUnityBuild = true` (default), UBT combines multiple .cpp files. A violation is only caught when:
|
|
233
|
+
- `bUseUnityBuild = false` (set in Target.cs for iteration)
|
|
234
|
+
- `bEnforceIWYU = true` (set in Build.cs)
|
|
235
|
+
- Building with `-singlefile` flag
|
|
236
|
+
|
|
237
|
+
**Fix pattern**: For each compilation unit, include exactly what it uses:
|
|
238
|
+
|
|
239
|
+
```cpp
|
|
240
|
+
// MyActor.cpp
|
|
241
|
+
#include "MyActor.h" // own header first — always
|
|
242
|
+
#include "Engine/World.h" // uses GetWorld()
|
|
243
|
+
#include "GameFramework/PlayerController.h" // uses APlayerController
|
|
244
|
+
// Do NOT include "CoreMinimal.h" and rely on it to pull in FString — include what you need
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Relying on Transitive Includes
|
|
248
|
+
|
|
249
|
+
```cpp
|
|
250
|
+
// ActorA.h includes Engine.h which includes World.h
|
|
251
|
+
// Your file:
|
|
252
|
+
#include "ActorA.h"
|
|
253
|
+
// ... uses UWorld without including Engine/World.h
|
|
254
|
+
|
|
255
|
+
// This breaks when ActorA.h changes its includes
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**Fix**: Include every header you directly use.
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Module Not Found at Runtime
|
|
263
|
+
|
|
264
|
+
### Symptom
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
LogModuleManager: Warning: ModuleNotFound: Could not find module 'MyModule'
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
or a crash at startup with module load failure.
|
|
271
|
+
|
|
272
|
+
**Checklist**:
|
|
273
|
+
1. Module is listed in `.uproject` or `.uplugin` `Modules` array
|
|
274
|
+
2. `LoadingPhase` is appropriate — if you load the module via C++ at a specific time, the module must have loaded by then
|
|
275
|
+
3. The module binary exists — rebuild the project
|
|
276
|
+
4. If it's a plugin module, the plugin is enabled in `.uproject`'s `Plugins` array
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Circular Dependency
|
|
281
|
+
|
|
282
|
+
### Symptom
|
|
283
|
+
|
|
284
|
+
```
|
|
285
|
+
Error: Circular dependency detected: ModuleA -> ModuleB -> ModuleA
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
UBT cannot build a static dependency graph that includes cycles.
|
|
289
|
+
|
|
290
|
+
**Resolution strategies**:
|
|
291
|
+
|
|
292
|
+
**Strategy 1: Extract a shared interface module**
|
|
293
|
+
|
|
294
|
+
Before:
|
|
295
|
+
- `ModuleA` depends on `ModuleB` (for `IServiceB`)
|
|
296
|
+
- `ModuleB` depends on `ModuleA` (for `IServiceA`)
|
|
297
|
+
|
|
298
|
+
After:
|
|
299
|
+
- `ModuleInterfaces` defines both `IServiceA` and `IServiceB`
|
|
300
|
+
- `ModuleA` depends on `ModuleInterfaces`
|
|
301
|
+
- `ModuleB` depends on `ModuleInterfaces`
|
|
302
|
+
|
|
303
|
+
**Strategy 2: Use DynamicallyLoadedModuleNames**
|
|
304
|
+
|
|
305
|
+
```csharp
|
|
306
|
+
// ModuleB.Build.cs — no compile-time dependency on ModuleA
|
|
307
|
+
DynamicallyLoadedModuleNames.Add("ModuleA");
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
Then at runtime:
|
|
311
|
+
```cpp
|
|
312
|
+
IModuleA* ModuleA = FModuleManager::GetModulePtr<IModuleA>("ModuleA");
|
|
313
|
+
if (ModuleA) { ModuleA->DoThing(); }
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
**Strategy 3: Forward declare and use pointers/references**
|
|
317
|
+
|
|
318
|
+
Move full includes from headers to .cpp files and use forward declarations in the header.
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## Hot Reload Failures
|
|
323
|
+
|
|
324
|
+
### Symptom: Changes not reflected after recompile
|
|
325
|
+
|
|
326
|
+
Hot Reload (Live Coding in UE5) has limitations:
|
|
327
|
+
- New UPROPERTY fields on existing UClasses are not applied to existing instances
|
|
328
|
+
- New UFUNCTIONs added to existing classes may not bind correctly
|
|
329
|
+
- Changes to class hierarchy require a full restart
|
|
330
|
+
|
|
331
|
+
**Fix**: For structural changes to UObject classes, always do a full restart rather than hot reload.
|
|
332
|
+
|
|
333
|
+
### Symptom: Crash on hot reload
|
|
334
|
+
|
|
335
|
+
```
|
|
336
|
+
Assertion failed: Class->ClassDefaultObject ...
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
Caused by:
|
|
340
|
+
- Adding/removing fields from USTRUCTs without restarting
|
|
341
|
+
- Changing the memory layout of UObjects that already have instances
|
|
342
|
+
|
|
343
|
+
**Fix**: Full rebuild and editor restart.
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Packaging / Cooking Errors
|
|
348
|
+
|
|
349
|
+
### Missing module in cooked build
|
|
350
|
+
|
|
351
|
+
```
|
|
352
|
+
LogPackageName: Error: DoesPackageExist: DoesPackageExistFast FAILED: 'MyModule'
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
**Cause**: A module with `Type: "Editor"` or `Type: "Developer"` was referenced from runtime code.
|
|
356
|
+
|
|
357
|
+
**Fix**:
|
|
358
|
+
- In C++: guard editor-only code with `#if WITH_EDITOR`
|
|
359
|
+
- In Build.cs: use `if (Target.bBuildEditor)` for editor-only dependencies
|
|
360
|
+
- In .uproject: ensure the module type matches actual usage
|
|
361
|
+
|
|
362
|
+
### Blueprint assets referencing stripped modules
|
|
363
|
+
|
|
364
|
+
If Blueprint graphs reference C++ functions from editor-only modules, cooking strips the module and breaks the Blueprint.
|
|
365
|
+
|
|
366
|
+
**Fix**: Move the referenced functions to a Runtime module, or use `CallInEditor = true` UFUNCTION specifier for functions that should only call from editor — ensuring they're never called from game code paths.
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
## Build Configuration Quick Reference
|
|
371
|
+
|
|
372
|
+
| Error type | First thing to check |
|
|
373
|
+
|---|---|
|
|
374
|
+
| LNK2019 unresolved symbol | Missing dependency or missing `MODULENAME_API` |
|
|
375
|
+
| C1083 cannot open include | Missing dependency or wrong include path |
|
|
376
|
+
| IWYU violation | Missing direct include, relying on transitive pull |
|
|
377
|
+
| UHT parse error | Missing `.generated.h` last, missing `GENERATED_BODY()` |
|
|
378
|
+
| Module not found at runtime | Not listed in .uproject/.uplugin, or wrong LoadingPhase |
|
|
379
|
+
| Circular dependency | Extract interface module or use dynamic loading |
|
|
380
|
+
| Cooking failure | Editor-only code/module referenced from runtime path |
|
|
381
|
+
| Hot reload crash | Structural UObject change — full restart required |
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ue-naming-conventions
|
|
3
|
+
description: "Asset naming y estructura de Content — Prefix_BaseAssetName_Variant_Suffix, prefijos por tipo de asset, layout de carpetas, identifiers seguros"
|
|
4
|
+
category: "gamedev"
|
|
5
|
+
argument-hint: "[asset, folder o review]"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# UE Naming Conventions & Content Structure
|
|
11
|
+
|
|
12
|
+
Names and folder layout are the cheapest consistency win in an Unreal project and the most expensive thing to fix later — renaming assets breaks references, and redirectors accumulate. Settle the convention once, record it in the project context, then hold the line.
|
|
13
|
+
|
|
14
|
+
Ask before writing: this skill renames assets and moves folders, which rewrites references across the project. Never rename in bulk without approval, a clean source-control state, and a Fix Up Redirectors pass afterwards.
|
|
15
|
+
|
|
16
|
+
## Context Check
|
|
17
|
+
|
|
18
|
+
Read `docs/unreal/project-context.md` before proposing anything. Confirm:
|
|
19
|
+
|
|
20
|
+
- **Whether the project already has a naming convention.** If it does, that convention wins — even where it disagrees with this skill. Consistency beats correctness here.
|
|
21
|
+
- The top-level content folder name and whether `Developers/` is in use
|
|
22
|
+
- Source control system, because a rename is a source-control operation before it is an editor one
|
|
23
|
+
|
|
24
|
+
## The Prime Directive
|
|
25
|
+
|
|
26
|
+
> An existing convention beats a better one. All structure, assets and code in the project should look like a single person created it, no matter how many people contributed.
|
|
27
|
+
|
|
28
|
+
If the project has no convention yet, propose the one below, get it agreed, and write it into `docs/unreal/project-context.md` so every other `ue-*` skill follows it.
|
|
29
|
+
|
|
30
|
+
## Base Asset Name
|
|
31
|
+
|
|
32
|
+
Every asset follows `Prefix_BaseAssetName_Variant_Suffix`:
|
|
33
|
+
|
|
34
|
+
- **`Prefix`/`Suffix`** — determined by asset type. See the reference table.
|
|
35
|
+
- **`BaseAssetName`** — a short, recognizable name for the logical group. Every asset belonging to the character Bob uses `Bob`.
|
|
36
|
+
- **`Variant`** — either a recognizable name (`Bob_Evil`, `Bob_Retro`) or a two-digit number starting at `01` for generic variations (`Rock_01`, `Rock_02`). Three digits means you should have split the base name instead. Variants can chain: `Flooring_Marble_01`.
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
SK_Bob Skeletal mesh
|
|
40
|
+
M_Bob Material
|
|
41
|
+
T_Bob_D Diffuse texture
|
|
42
|
+
T_Bob_N Normal texture
|
|
43
|
+
T_Bob_Evil_D Diffuse for the Evil variant
|
|
44
|
+
MI_Rock_Snow Material instance variant
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Identifier Charset
|
|
48
|
+
|
|
49
|
+
In **any** identifier — asset, folder, C++ symbol, path — restrict to `[A-Za-z0-9_]` and use `_` sparingly. Never use:
|
|
50
|
+
|
|
51
|
+
- Whitespace of any kind
|
|
52
|
+
- Backslashes, or symbols like `#!@$%`
|
|
53
|
+
- Any Unicode character
|
|
54
|
+
|
|
55
|
+
A character named `Zoë` gets a folder named `Zoe`. This is not pedantry: spaces and Unicode break batch tools, cooking, and source control in ways that surface as unexplained failures far from the cause. The same applies to the project's own path on disk — prefer `D:\Project` over a `My Documents` subfolder.
|
|
56
|
+
|
|
57
|
+
## Content Directory Structure
|
|
58
|
+
|
|
59
|
+
- **One top-level folder named after the project.** All project content lives in `Content/MyProject/`, never loose in `Content/`. This is what makes the project safely mergeable with marketplace and plugin content.
|
|
60
|
+
- **`PascalCase` folder names, no spaces, no Unicode.**
|
|
61
|
+
- **`Maps/`** — every level lives under `Content/MyProject/Maps`, subfolders welcome. Keeps cooking, lighting and QA scripts sane, and means "open this map" needs no directions.
|
|
62
|
+
- **`Core/`** — the fundamental classes: base GameMode, GameState, PlayerController, PlayerState, Character. A visible "don't touch" boundary. Designers tweak child classes elsewhere.
|
|
63
|
+
- **`MaterialLibrary/`** — master materials, layered materials, material functions and shared utility textures. Makes a "material instances only" policy enforceable: any plain material outside this folder is a violation you can grep for. Put debug materials in `MaterialLibrary/Debug` so they are trivial to strip and obvious if referenced.
|
|
64
|
+
- **`Developers/`** — per-person sandbox, hidden in the Content Browser by default. Work here cannot be accidentally depended on. Promote an asset by moving it into the project folder and fixing up redirectors.
|
|
65
|
+
- **No folders named `Assets` or `AssetTypes`** — everything is an asset, and grouping by type instead of purpose fights the Content Browser's own filters.
|
|
66
|
+
- **No empty folders.** They clutter the browser and usually mean a redirector was never fixed up.
|
|
67
|
+
|
|
68
|
+
> → Read references/content-structure.md for the example project layout, the very-large-asset-set exception, and the safe procedure for deleting a stubborn empty folder
|
|
69
|
+
|
|
70
|
+
## Asset Prefixes
|
|
71
|
+
|
|
72
|
+
> → Read references/asset-name-modifiers.md for the full prefix/suffix tables by asset type, including the UE5 types the original guide predates and the texture packing suffixes
|
|
73
|
+
|
|
74
|
+
The ones worth memorizing:
|
|
75
|
+
|
|
76
|
+
| Type | Prefix | Type | Prefix |
|
|
77
|
+
|------|--------|------|--------|
|
|
78
|
+
| Blueprint | `BP_` | Widget Blueprint | `WBP_` |
|
|
79
|
+
| Blueprint Interface | `BPI_` | Animation Blueprint | `ABP_` |
|
|
80
|
+
| Material | `M_` | Material Instance | `MI_` |
|
|
81
|
+
| Static Mesh | `SM_` | Skeletal Mesh | `SK_` |
|
|
82
|
+
| Texture | `T_` | Niagara System | `NS_` |
|
|
83
|
+
| Data Asset | `DA_` | Data Table | `DT_` |
|
|
84
|
+
| Input Action | `IA_` | Input Mapping Context | `IMC_` |
|
|
85
|
+
| Behavior Tree | `BT_` | Blackboard | `BB_` |
|
|
86
|
+
|
|
87
|
+
## Two Conflicts To Resolve Explicitly
|
|
88
|
+
|
|
89
|
+
**Static Mesh: `SM_` or `S_`?** The Gamemakin guide specifies `S_` and notes that many teams use `SM_`. Epic's own tooling — including the asset prefixes its MCP server keys off — assumes `SM_`. This skill defaults to **`SM_`** for that reason. If the project already uses `S_`, keep `S_` and record it in the project context.
|
|
90
|
+
|
|
91
|
+
**Structs and enums.** The guide uses `F`/`S` for structs and `E` for enums with no underscore, matching C++. For Blueprint-authored types many teams prefer `F_`/`E_` to keep them visually distinct from C++ types. Either is fine; pick one and record it.
|
|
92
|
+
|
|
93
|
+
## Common Mistakes
|
|
94
|
+
|
|
95
|
+
- **Renaming assets without a redirector pass**, leaving dangling references that only surface at cook time
|
|
96
|
+
- **Bulk renames without source control clean**, making the change impossible to revert cleanly
|
|
97
|
+
- **Content loose in `Content/`** rather than under a project folder, which collides with plugin and marketplace content
|
|
98
|
+
- **Grouping by asset type** (`Content/Meshes`, `Content/Textures`) instead of by feature — the Content Browser already filters by type
|
|
99
|
+
- **Spaces or Unicode** in a name, a folder, or the project path
|
|
100
|
+
- **Plain materials outside `MaterialLibrary/`**, quietly defeating a material-instance policy
|
|
101
|
+
- **Levels scattered outside `Maps/`**, making cook and lighting scripts fragile
|
|
102
|
+
- **Treating a UE4-era prefix list as current** — Cascade `PS_` is Niagara `NS_`/`NE_` now, Matinee is Sequencer, Destructible Mesh is Chaos
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Related Skills
|
|
107
|
+
|
|
108
|
+
- `/ue-project-context` — the document that records which convention this project actually uses
|
|
109
|
+
- `/ue-data-assets-tables` — `DA_`/`DT_` assets and the Asset Manager paths that depend on stable names
|
|
110
|
+
- `/ue-materials-rendering` — the `MaterialLibrary/` policy and `M_`/`MI_` split
|
|
111
|
+
- `/ue-blueprints` — Blueprint variable and function naming inside the graph
|
|
112
|
+
- `/ue-world-level-streaming` — `Maps/` layout, persistent level `_P` suffix, data layers
|
|
113
|
+
- `/asset-audit` — cross-engine audit for naming, size, format and orphaned assets
|
|
114
|
+
|
|
115
|
+
## Reference Files
|
|
116
|
+
|
|
117
|
+
- `references/asset-name-modifiers.md` — full prefix/suffix tables by asset type, plus UE5 additions and texture packing
|
|
118
|
+
- `references/content-structure.md` — example project layout, folder rules in depth, empty-folder removal procedure
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Checklist
|
|
123
|
+
|
|
124
|
+
Validate before considering the work done:
|
|
125
|
+
|
|
126
|
+
- [ ] The project's existing convention was checked first and takes precedence
|
|
127
|
+
- [ ] Every new asset follows `Prefix_BaseAssetName_Variant_Suffix` with the right prefix for its type
|
|
128
|
+
- [ ] No identifier, folder or path contains spaces, Unicode or symbols outside `[A-Za-z0-9_]`
|
|
129
|
+
- [ ] Project content sits under a single top-level project folder, with levels under `Maps/`
|
|
130
|
+
- [ ] Any rename ran with clean source control and a Fix Up Redirectors pass afterwards
|
|
131
|
+
- [ ] The agreed convention is written into `docs/unreal/project-context.md`
|
|
132
|
+
- [ ] Conventions in `docs/unreal/project-context.md` were read and followed
|
|
133
|
+
- [ ] The Common Mistakes section of this skill was reviewed against the change
|
|
134
|
+
|
|
135
|
+
**PASS** — every item holds. **CONCERNS** — the work stands but at least one item is unresolved and worth flagging to the user. **FAIL** — an item is violated in a way that breaks asset references or leaves the project inconsistent; fix it before handing the work over.
|
|
136
|
+
|
|
137
|
+
## Next Steps
|
|
138
|
+
|
|
139
|
+
- `/ue-project-context` — record the convention so the rest of the `ue-*` skills follow it
|
|
140
|
+
- `/asset-audit` — sweep the existing project for violations
|
|
141
|
+
- `/code-review` — architectural and quality review of the change
|
|
142
|
+
- `/commit` — conventional commit once the change is verified
|