Make ownership clear from the pointer type
The pointer tells you whether the field keeps an object alive, observes it, loads it later, or owns a plain C++ object.
UPROPERTY(VisibleAnywhere, Category = "Combat")
TObjectPtr<UWeaponComponent> WeaponComponent;
TWeakObjectPtr<AActor> CurrentTarget;
UPROPERTY(EditDefaultsOnly, Category = "UI")
TSoftObjectPtr<UTexture2D> InventoryIcon;
TUniquePtr<FNavigationQuery> PendingQuery;
TSharedPtr<FInventoryViewModel> InventoryViewModel;- Why
- Unreal garbage collection and C++ reference counting can follow the intended lifetime. Other developers do not have to inspect every assignment to work out who owns what.
- Costs
- A strong reference can keep an object or asset alive longer than expected. Weak and soft references require a validity check or load step when used.
- Instead
- Use a raw
UObject*for short-lived local variables and parameters. UseTStrongObjectPtrcautiously when a non-UObject owner must keep a UObject alive.

