Unreal Engine
// Avoid common Unreal mistakes — garbage collection, UPROPERTY macros, replication authority, and asset reference pitfalls.
$ git log --oneline --stat
stars:1,933
forks:367
updated:March 4, 2026
SKILL.mdreadonly
SKILL.md Frontmatter
nameUnreal Engine
descriptionAvoid common Unreal mistakes — garbage collection, UPROPERTY macros, replication authority, and asset reference pitfalls.
metadata[object Object]
Garbage Collection
- Raw pointers to UObjects get garbage collected — use
UPROPERTY()to prevent UPROPERTY()marks for GC tracking — without it, pointer becomes danglingTWeakObjectPtrfor optional references — doesn't prevent collection, checkIsValid()NewObject<T>()for UObjects — never rawnew, GC won't track it
UPROPERTY and UFUNCTION
UPROPERTY()required for Blueprint access — and for GC trackingUFUNCTION()for Blueprint callable/events — also required for replicationEditAnywherevsVisibleAnywhere— edit allows changes, visible is read-onlyBlueprintReadWritevsBlueprintReadOnly— controls Blueprint access level
Actor Lifecycle
BeginPlayafter all components initialized — safe to access components- Constructor runs on CDO (Class Default Object) — don't spawn actors or access world
PostInitializeComponentsbefore BeginPlay — for component setupEndPlayfor cleanup — called on destroy and level transition
Tick Performance
- Disable tick when not needed —
PrimaryActorTick.bCanEverTick = false - Use timers instead of tick + counter —
GetWorldTimerManager().SetTimer() - Tick groups for ordering —
PrePhysics,DuringPhysics,PostPhysics - Blueprint tick expensive — move hot logic to C++
Replication
- Server is authority — clients request, server validates and replicates
UPROPERTY(Replicated)for variable sync — implementGetLifetimeReplicatedPropsUFUNCTION(Server)for client-to-server RPC — must beReliableorUnreliableHasAuthority()to check if server — before executing authoritative logicRoleandRemoteRolefor network role checks —ROLE_Authorityis server
Asset References
- Hard references load with parent — bloats memory, use for always-needed
- Soft references (
TSoftObjectPtr) load on demand — for optional or large assets LoadSynchronous()orAsyncLoadfor soft refs — don't access until loaded- Blueprint class references:
TSubclassOf<T>— type-safe class selection
Memory and Pointers
TSharedPtrfor non-UObjects — reference counted, auto-deletesTUniquePtrfor exclusive ownership — can't copy, moves onlyMakeShared<T>()for creation — single allocation for object and control block- Never mix raw
new/deletewith smart pointers — choose one pattern
Common Mistakes
- Accessing null actor in Blueprint — use
IsValid()node before access - PIE (Play In Editor) vs packaged build differ — test shipping build
- Hot reload corrupts Blueprints — close editor, build, reopen
GetWorld()null in constructor — world doesn't exist yet, use BeginPlay- Spawning in constructor crashes — defer to BeginPlay or later
FStringfor display,FNamefor identifiers — FName is hashed, faster comparison