A vertical slice of a horror game with fixed cameras showcasing production-grade Unreal Engine 5 C++: async asset streaming with stale-load guards, interface-driven interaction, CommonUI-backed static-camera framing, and strict ownership semantics throughout.
Unreal Engine 5 · C++ · CommonUI · Enhanced Input · UMG · GameplayTags ·
Streamable Manager
Gameplay Systems · Editor Tools · CI/CD Pipeline · Procedural Content Generation · Gameplay Message Runtime
-
Async, memory-safe item loading.
UItemData(aUPrimaryDataAsset) holds mesh, material, and input action asTSoftObjectPtr;AInteractableItemstreams them viaFStreamableHandle, guarding against stale completions with anExpectedAssetNametoken and cancelling pending loads inBeginDestroy. -
Abstracted Interaction system.
IInteractableInterfaceexposesAllowInteraction/DenyInteraction/InteractasBlueprintNativeEvents, fully decoupling the player from concrete item types and allowing extension from either C++ or Blueprint. -
Data-driven item management. Items are defined entirely by
UItemDataassets — no hardcoded content — and theFOnInteractionAlloweddelegate broadcasts anFDataTableRowHandleso designers author input prompts in a DataTable with zero C++ changes. -
Modern smart pointers.
TObjectPtrfor owned UPROPERTY refs,TWeakObjectPtrfor non-owning observers (CurrentInteractable, cachedUEnhancedInputComponent),TSoftObjectPtrfor deferred content,TSharedPtr<FStreamableHandle>for streaming lifetimes — zero rawnew/delete. -
Abstract base + specialization.
ADecadentCharacterBaseisUCLASS(Abstract);ADecadentPlayerCharacterandADecadenceEnemyCharacterspecialize it — shared behavior in one place, base class never instantiable. -
Enhanced Input, bound in C++. Player caches
FEnhancedInputActionEventBindingfor the interact action so bindings tear down cleanly across possession changes instead of leaking. -
CommonUI static-camera system.
AStaticCameraTrigger(box volume +ACameraActor+ configurableEViewTargetBlendFunction) drivesUStaticCameraManagerComponent, which fires typed multicast delegates carryingTSubclassOf<UCommonActivatableWidget>— the widget stack owns its lifecycle, the component only signals intent.
Click the thumbnail below to watch the tooling walkthrough on YouTube.
Note: No AI tool was used for the development of the code. AI tools were only used as a research tool to dive into technical functionalities, identify possible bug causes, and write documentation.
© Gabriel Borges. All rights reserved — contact for licensing.
