Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Expert guide for Unreal Engine 5.x C++ development, covering UObject hygiene, performance patterns, and best practices.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-14 | ✗→✓ | ▲ Improved | 33% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 23% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 46% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 37% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 43% | 0% |
This skill provides expert-level guidelines for developing with Unreal Engine 5 using C++. It focuses on writing robust, performant, and standard-compliant code.
Use this skill when:
Do not use this skill when:
UPROPERTY() for UObject* member variables to ensure they are tracked by the Garbage Collector (GC).TStrongObjectPtr<> if you need to keep a root reference outside of a UObject graph, but prefer addToRoot() generally.IsValid() check vs nullptr. IsValid() handles pending kill state safely.UCLASS(), USTRUCT(), UENUM(), UFUNCTION() to expose types to the reflection system and Blueprints.BlueprintReadWrite when possible; prefer BlueprintReadOnly for state that shouldn't be trampled by logic in UI/Level BPs.bCanEverTick = false) by default. Only enable it if absolutely necessary. Prefer timers (GetWorldTimerManager()) or event-driven logic.Cast<T>() in hot loops. Cache references in BeginPlay.F structs for data-heavy, non-UObject types to reduce overhead.Follow Epic Games' coding standard:
T (e.g., TArray, TMap).U (e.g., UCharacterMovementComponent).A (e.g., AMyGameMode).S (Slate widgets).F (e.g., FVector).E (e.g., EWeaponState).I (e.g., IInteractable).b (e.g., bIsDead).Avoid GetComponentByClass in Tick. Do it in PostInitializeComponents or BeginPlay.
cppvoid AMyCharacter::PostInitializeComponents() { Super::PostInitializeComponents(); HealthComp = FindComponentByClass<UHealthComponent>(); check(HealthComp); // Fail hard in dev if missing }
Use interfaces to decouple systems (e.g., Interaction system).
cpp// Interface call check if (TargetActor->Implements<UInteractable>()) { IInteractable::Execute_OnInteract(TargetActor, this); }
Avoid hard references (UPROPERTY(EditDefaultsOnly) TSubclassOf<AActor>) for massive assets which force load orders. Use TSoftClassPtr or TSoftObjectPtr.
cppUPROPERTY(EditAnywhere, BlueprintReadWrite) TSoftClassPtr<AWeapon> WeaponClassToLoad; void AMyCharacter::Equip() { if (WeaponClassToLoad.IsPending()) { WeaponClassToLoad.LoadSynchronous(); // Or use StreamableManager for async } }
UE_LOG with custom categories.cpp DEFINE_LOG_CATEGORY_STATIC(LogMyGame, Log, All); UE_LOG(LogMyGame, Warning, TEXT("Health is low: %f"), CurrentHealth);
cpp if (GEngine) GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Died!"));
IVisualLoggerDebugSnapshotInterface.UObject* members wrapped in UPROPERTY?EndPlay?Other measured skills in the registry, with their headline benchmark lift.