6.0 KiB
6.0 KiB
User Preferences
- Use
build.py c++for lightweight C++ rebuilds,build.py allfor full rebuilds. - Does a lot of refactoring in early development stages. Be ready for frequent renames, restructuring, and changes of mind without pushback.
- VS Code is the IDE. Use
code --goto <filename>:<line>to open files/locations in the IDE instead of showing code snippets at the prompt. - When asked to "show me" code, open it in VS Code rather than pasting it in the terminal.
- The Unreal Engine source for this project lives at
/home/jyelon/integration.UE(sibling to the project dir), not~/UnrealEngine. Always use this copy when working on the integration project. - Many of Unreal's basic data types (FString, TArray, TSet, TMap, etc.) are in
integration.UE/Engine/Source/Runtime/Core/Public/Containers/. - Editor log files are at
integration/User/jyelon/Saved/Logs/.
Critical: Minimize Diff Noise
- The user reviews all changes via
git diffin VS Code. Every unnecessary diff line costs review time. - Preserve all existing comments. Comments describe the logic, not the syntax — they survive refactors. Only remove a comment if the code it described was genuinely deleted.
- Don't rename variables, reorder code, or reformat lines unless directly required by the task. If a variable name works, leave it. If a comment is in the right place, don't move it.
- Don't make gratuitous changes. If it doesn't need to change, don't touch it.
Coding Style Preferences
- No FREE-FLOATING (file-scope) static functions in Unreal code. Use class methods (incl.
staticmember functions) or namespace-scoped functions instead. Astaticmember function inside a class is fine — e.g. a Blueprint-callable factory. The rule is only against file-localstaticfree functions. (Corrected 2026-05-26 after I misread this as banning allstatic.) - Prefer in-class member initializers (
int x_ = 0;in the header) over explicit initialization in constructor bodies. When touching constructors, migrate toward this style. - Inline empty constructors/destructors in the header when possible.
- Avoid ternary operator unless very concise (e.g.,
x ? 1 : 0). For longer expressions, use early-returnifinstead. - When asked for a small change, do exactly that. If it turns out to require broader refactoring, STOP and explain the situation instead of silently rewriting the module.
Tools
tools/clangd-query.py— Query clangd for C++ symbols. Uses a background daemon for fast responses after first invocation (~10s cold, milliseconds warm). Commands:python3 tools/clangd-query.py symbol <name>— Find symbols by name across the whole project.python3 tools/clangd-query.py definition <file> <line> <col>— Go to definition (1-based line/col).python3 tools/clangd-query.py references <file> <line> <col>— Find all references (1-based line/col).python3 tools/clangd-query.py diagnostics <file>— Get errors/warnings for a file.python3 tools/clangd-query.py stop— Stop the daemon.- Prefer this over grep when looking for C++ class/function definitions or references.
Asset Naming Conventions
| Folder | Class | Prefix | Example |
|---|---|---|---|
/Game/StaticMeshes |
UStaticMesh | SM_ |
SM_Rock |
/Game/SkeletalMeshes |
USkeletalMesh | SKM_ |
SKM_Character |
/Game/AnimSequences |
UAnimSequence | SEQ_ |
SEQ_Walk |
/Game/Tangibles |
UBlueprint (Actor) | TAN_ |
TAN_Tree |
/Game/Widgets |
UWidgetBlueprint | WB_ |
WB_Hotkeys |
- Blueprints in
/Game/Luprex/use thelxprefix (e.g.,lxPlayerController) and are loaded directly, not through the asset lookup system. - See
Source/Integration/AssetLookup.cppfor the indexing logic.
UE Wingman
- UE Wingman is a command-line tool (no longer an MCP server). Plugin lives in
Plugins/UEWingman/; CLI isue-wingman(on PATH at/home/jyelon/bin/ue-wingman). - Invoke directly via Bash. Subcommands are CamelCase, e.g.
ue-wingman Graph_Dump <path> True. - Start by reading the manual:
ue-wingman Documentation_Manual. Also useful:Documentation_Commands(concise list),Documentation_Command <Name>(detailed help for one command). - Common commands:
Blueprint_Dump,Graph_Dump,Details_Dump,Details_Set,GraphNode_ShowMenu,GraphNode_ChooseMenu,Variables_Add/Modify/Remove,TypeName_Search. - Fetcher path syntax:
/Game/<Asset>,graph:<GraphName>,node:<NodeId>,pin:<PinName>(alsowidget:,component:,levelblueprint:,structprop:). FNames in paths use periods for spaces (e.g.graph:Handle.Invalid.Lua.Command, notHandleInvalidLuaCommand). Other marks\"'(),.:;<=>&use HTML entity escapes like . - ue-wingman is much faster than the LLM — batch multiple commands with
;instead of running one at a time.
Project
- Eris addinfo intentionally removed —
luaG_runerrorno longer prefixesfile:line:; traceback machinery handles location info
Feedback
- UE Wingman testing mindset — flag tool friction during game work sessions
- Use mv for file renames — mv + targeted edits, don't rewrite from memory
- LLDB formatter style — let lldb do the math — typed SBValues, no raw pointer/byte math in Python
- LLDB formatter style — no defensive IsValid checks — let invalid SBValues fail loudly; silent returns conceal bugs
- C++ never depends on Blueprint — construct widget trees in C++; don't reference WBP assets from C++
- Prefer check() over silent-skip — invariants use check(); silent continue/return hides bugs
- Don't auto-build after every change — only build when the user asks
- Edit workspace template, not the generated file —
Integration.code-workspaceis generated; editIntegration.code-workspace.tpl.json