Actors & components
An Actor (AActor) is anything you can place or spawn in a level. Components are the
reusable pieces of behavior/representation you compose onto actors. "Composition over
inheritance" is the intended design: prefer adding components over deep actor class hierarchies.
When to use this skill
- Creating a new
AActor or UActorComponent subclass.
- Setting up a component hierarchy (root + attached scene components) and choosing the root.
- Spawning actors (immediate or deferred) or adding/registering components at runtime.
- Wiring overlap/hit events, or deciding what runs in the constructor vs
BeginPlay.
- Debugging "BeginPlay didn't run", "component has no transform / doesn't render", attachment
problems, or "my runtime component does nothing".
Component types
UActorComponent is the base for all components. The three tiers, in increasing capability:
| Type |
Has transform? |
Renders/collides? |
Use for |
UActorComponent |
no |
no |
pure behavior/data (health, inventory, AI logic, abilities) |
USceneComponent |
yes (location/rotation/scale) |
no |
transform nodes, attach points, spring arms, cameras |
UPrimitiveComponent |
yes |
yes |
meshes, collision, anything drawn or physical |
Concrete primitives you will use most: UStaticMeshComponent, USkeletalMeshComponent,
UCapsuleComponent, UBoxComponent, USphereComponent, UCameraComponent,
USpringArmComponent.
Key consequences of the hierarchy:
- Only
USceneComponent-derived components have a transform, can be attached into a hierarchy,
or be the root component.
- Only
USceneComponent/UPrimitiveComponent create a render state by default; plain
UActorComponents don't (nothing to draw).
- Only
UPrimitiveComponent creates a physics state by default (collision/simulation).
See references/components-and-registration.md for the
full type breakdown, render/physics state, and registration internals.
AActor lifecycle (order matters)
The canonical order for a typical gameplay actor:
- Constructor — set defaults,
CreateDefaultSubobject for owned components. No world,
no gameplay; also runs on the Class Default Object (CDO) and in the editor.
OnConstruction(Transform) — re-runs whenever a placed actor's properties change (construction
script). Runs in editor and on spawn; keep it idempotent.
PreInitializeComponents → per-component InitializeComponent → PostInitializeComponents —
components exist & are registered; safe to wire them together.
BeginPlay — gameplay starts. Do gameplay init here (spawning, timers, delegate bindings),
not in the constructor.
Tick(DeltaSeconds) — per-frame, only if ticking is enabled (see Ticking).
EndPlay(Reason) — leaving play (destroyed, level change, PIE end, app shutdown);
clean up timers/delegates here.
Destroyed (legacy) then BeginDestroy / FinishDestroy during garbage collection.
There are three distinct creation paths that converge before BeginPlay: load-from-disk
(PostLoad), Play-in-Editor duplication (PostDuplicate), and spawning (PostActorCreated →
OnConstruction). PostLoad and PostActorCreated are mutually exclusive. The full flow,
including deferred spawn and the GC sequence, is in
references/actor-lifecycle.md.
Verified in 5.8 (GameFramework/Actor.h): BeginPlay():2125, EndPlay():2132,
PostInitProperties():2343, Tick(float):3060, PreInitializeComponents():3124,
PostInitializeComponents():3127, OnConstruction():3445, Destroyed():3569.
Constructor vs BeginPlay: the constructor runs on the CDO and in the editor, with no world.
Never do gameplay logic (spawning, world queries, timers, delegate binding) there — use BeginPlay.
Authoring an actor with components
// Pickup.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Pickup.generated.h"
class USphereComponent;
class UStaticMeshComponent;
UCLASS()
class MYGAME_API APickup : public AActor
{
GENERATED_BODY()
public:
APickup();
protected:
virtual void BeginPlay() override;
// Overlap handlers must be UFUNCTION() with the exact delegate signature, or AddDynamic fails.
UFUNCTION()
void OnOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,
UPrimitiveComponent* OtherComp, int32 OtherBodyIndex,
bool bFromSweep, const FHitResult& Sweep);
UPROPERTY(VisibleAnywhere) TObjectPtr<USphereComponent> Trigger; // root, collision
UPROPERTY(VisibleAnywhere) TObjectPtr<UStaticMeshComponent> Mesh; // visual
};
// Pickup.cpp
#include "Pickup.h"
#include "Components/SphereComponent.h"
#include "Components/StaticMeshComponent.h"
APickup::APickup()
{
PrimaryActorTick.bCanEverTick = false; // default OFF; opt in only if you override Tick
Trigger = CreateDefaultSubobject<USphereComponent>(TEXT("Trigger"));
SetRootComponent(Trigger);
Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
Mesh->SetupAttachment(Trigger); // attach in the constructor with SetupAttachment
}
void APickup::BeginPlay()
{
Super::BeginPlay();
Trigger->OnComponentBeginOverlap.AddDynamic(this, &APickup::OnOverlap);
}
Key rules:
CreateDefaultSubobject<T>(TEXT("UniqueName")) is constructor-only; the names must be unique
within the actor. It is declared on UObject (CoreUObject/Public/UObject/Object.h).
- Hold component pointers in
UPROPERTY() TObjectPtr<T> members so the GC keeps them alive and
they show in the editor. A raw T* UPROPERTY also works but TObjectPtr is the modern form.
- Set the root with
SetRootComponent (or assign RootComponent). The actor's world transform
comes from its root.
- In the constructor, attach with
SetupAttachment(Parent). At runtime, use AttachToComponent.
- Forward-declare component classes in the header and
#include the concrete component headers in
the .cpp to keep header dependencies light.
Spawning actors at runtime
FActorSpawnParameters Params;
Params.Owner = this;
Params.SpawnCollisionHandlingOverride =
ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
APickup* P = GetWorld()->SpawnActor<APickup>(PickupClass, Location, Rotation, Params);
// Deferred spawn: set properties/expose-on-spawn values before BeginPlay runs
AThing* T = GetWorld()->SpawnActorDeferred<AThing>(ThingClass, Transform);
T->Damage = 50.f;
T->FinishSpawning(Transform); // runs construction → PostInitializeComponents → BeginPlay
PickupClass is typically a UPROPERTY(EditAnywhere) TSubclassOf<APickup> so designers pick the
Blueprint subclass. Spawning the C++ class directly skips Blueprint-authored defaults/components.
- Use deferred spawn when the actor needs values set before
BeginPlay (e.g. a projectile's
damage/owner). Plain SpawnActor runs the constructor and BeginPlay immediately.
GetWorld() can be null on the CDO/in the constructor — only spawn from gameplay code.
Full spawn-parameter fields, collision-handling values, and destroy/pooling guidance:
references/spawning-and-destroying.md.
Adding components at runtime
UStaticMeshComponent* Extra = NewObject<UStaticMeshComponent>(this);
Extra->SetupAttachment(GetRootComponent()); // or AttachToComponent if already registered
Extra->RegisterComponent(); // REQUIRED so it ticks/renders/collides
Runtime components must be RegisterComponent()-ed — registration is what associates a
component with the world/scene so it can update, render, and collide. Default subobjects created in
the constructor are registered for you during the actor's spawn. Registering many components during
play has a cost; prefer creating them as default subobjects when you can.
Attachment
// Runtime attach/detach (scene components only):
Mesh->AttachToComponent(Target, FAttachmentTransformRules::SnapToTargetIncludingScale, SocketName);
Mesh->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);
// Whole-actor attach (attaches this actor's root to another actor/component):
AttachToActor(OtherActor, FAttachmentTransformRules::KeepRelativeTransform);
SetupAttachment is for the constructor / not-yet-registered components; AttachToComponent
attaches immediately and is for play. Using SetupAttachment at runtime does nothing without
registration.
- Attachment rules choose, per channel, whether to keep the world transform or snap to the
parent/socket. A component can have many children but only one parent; cycles are not allowed.
Attachment rules, sockets, mobility, and relative-vs-world transforms:
references/attachment-and-transforms.md.
Ticking
- Actors: set
PrimaryActorTick.bCanEverTick = true; in the constructor, then override Tick.
- Components: set
PrimaryComponentTick.bCanEverTick = true; then override TickComponent.
- Both default to off.
bCanEverTick only makes ticking possible; you can toggle it at
runtime with PrimaryActorTick.SetTickFunctionEnable(true/false).
- Prefer events/timers (
ue-timers-and-async) over ticking when you can — ticking everything is a
common performance sink. Leave bCanEverTick = false for actors that don't need per-frame work.
Finding components
UStaticMeshComponent* M = GetComponentByClass<UStaticMeshComponent>(); // first of class
TArray<USceneComponent*> All;
GetComponents<USceneComponent>(All); // all of class
Gotchas
- Gameplay logic in the constructor — runs on the CDO/editor with no world; use
BeginPlay.
- Overlap/hit handler not a
UFUNCTION() — AddDynamic silently fails to fire; the bound
function must be a UFUNCTION() with the exact delegate signature.
- Forgot
RegisterComponent() on a runtime component → it won't render/collide/tick.
- Attaching a non-scene component — only
USceneComponent+ can attach or have a transform.
SetupAttachment at runtime does nothing without registration; use AttachToComponent.
- No overlaps firing — the primitive needs collision enabled and
SetGenerateOverlapEvents(true)
on both components, with overlapping collision responses.
- No cleanup in
EndPlay — timers/delegates referencing this actor can dangle; clear them.
EndPlay runs for all exit reasons, so it's the right place (not Destroyed).
- Static mobility moved at runtime — only
Movable components can be transformed during play;
setting transform on a Static component is ignored/asserts.
- Spawning into a blocked location can fail and return null; set a collision-handling override.
Version notes
TObjectPtr<T> is the current idiom for object UPROPERTYs (UE5+); older code uses raw T*,
which still works. See ue-memory-and-gc.
- The lifecycle callbacks and component model here are stable across UE5; line numbers in citations
drift between patch releases, but the header paths and class/function names are stable.
References & source material
Engine source (UE 5.8, under Engine/Source/Runtime/):
Engine/Classes/GameFramework/Actor.h — AActor lifecycle, RootComponent:1024,
PrimaryActorTick:318, SetRootComponent:2493, AttachToActor:2029, FinishSpawning:3117,
GetComponentByClass:3796.
Engine/Classes/Components/ActorComponent.h — UActorComponent, RegisterComponent:1322,
OnRegister:830, InitializeComponent:919, BeginPlay:936, TickComponent:976,
PrimaryComponentTick:177, bWantsInitializeComponent:340.
Engine/Classes/Components/SceneComponent.h — transforms, SetupAttachment:734,
AttachToComponent:752, DetachFromComponent:786, Mobility:303.
Engine/Classes/Components/PrimitiveComponent.h — rendering/collision, OnComponentBeginOverlap:1468,
SetGenerateOverlapEvents:418, SetCollisionEnabled:2026.
Engine/Classes/Engine/World.h — SpawnActor/SpawnActorDeferred:3851, FActorSpawnParameters:420.
Engine/Classes/Engine/EngineTypes.h — FAttachmentTransformRules:75, EEndPlayReason:3670,
ESpawnActorCollisionHandlingMethod:4411.
CoreUObject/Public/UObject/Object.h — CreateDefaultSubobject:151.
Official docs (UE 5.8):
Deep-dive references in this skill:
- references/actor-lifecycle.md — full creation paths, component
init sub-sequence, end-of-life and garbage collection.
- references/components-and-registration.md — type
hierarchy, registration/render/physics state,
InitializeComponent vs BeginPlay, ticking.
- references/attachment-and-transforms.md — attachment
APIs, transform rules, sockets, mobility.
- references/spawning-and-destroying.md — spawn variants,
spawn parameters, deferred spawn, destruction, pooling.
1---2name: ue-actors-and-components3description: Build and compose gameplay objects from Actors and Components in Unreal C++ — the AActor lifecycle (constructor, PostInitializeComponents, BeginPlay, Tick, EndPlay, Destroyed), the component types (UActorComponent, USceneComponent, UPrimitiveComponent), the root component and attachment, spawning actors and creating/registering components at construction or runtime, and ticking. Use when creating an actor or component, setting up a component hierarchy, attaching components, spawning actors, registering runtime components, or debugging lifecycle/ticking/ attachment/overlap issues.4---56# Actors & components78An **Actor** (`AActor`) is anything you can place or spawn in a level. **Components** are the9reusable pieces of behavior/representation you compose onto actors. "Composition over10inheritance" is the intended design: prefer adding components over deep actor class hierarchies.1112## When to use this skill1314- Creating a new `AActor` or `UActorComponent` subclass.15- Setting up a component hierarchy (root + attached scene components) and choosing the root.16- Spawning actors (immediate or deferred) or adding/registering components at runtime.17- Wiring overlap/hit events, or deciding what runs in the constructor vs `BeginPlay`.18- Debugging "BeginPlay didn't run", "component has no transform / doesn't render", attachment19 problems, or "my runtime component does nothing".2021## Component types2223`UActorComponent` is the base for all components. The three tiers, in increasing capability:2425| Type | Has transform? | Renders/collides? | Use for |26|---|---|---|---|27| `UActorComponent` | no | no | pure behavior/data (health, inventory, AI logic, abilities) |28| `USceneComponent` | **yes** (location/rotation/scale) | no | transform nodes, attach points, spring arms, cameras |29| `UPrimitiveComponent` | yes | **yes** | meshes, collision, anything drawn or physical |3031Concrete primitives you will use most: `UStaticMeshComponent`, `USkeletalMeshComponent`,32`UCapsuleComponent`, `UBoxComponent`, `USphereComponent`, `UCameraComponent`,33`USpringArmComponent`.3435Key consequences of the hierarchy:36- Only `USceneComponent`-derived components have a transform, can be **attached** into a hierarchy,37 or be the **root component**.38- Only `USceneComponent`/`UPrimitiveComponent` create a **render state** by default; plain39 `UActorComponent`s don't (nothing to draw).40- Only `UPrimitiveComponent` creates a **physics state** by default (collision/simulation).4142See [references/components-and-registration.md](references/components-and-registration.md) for the43full type breakdown, render/physics state, and registration internals.4445## AActor lifecycle (order matters)4647The canonical order for a typical gameplay actor:48491. **Constructor** — set defaults, `CreateDefaultSubobject` for owned components. No world,50 no gameplay; also runs on the Class Default Object (CDO) and in the editor.512. `OnConstruction(Transform)` — re-runs whenever a placed actor's properties change (construction52 script). Runs in editor and on spawn; keep it idempotent.533. `PreInitializeComponents` → per-component `InitializeComponent` → `PostInitializeComponents` —54 components exist & are registered; safe to wire them together.554. **`BeginPlay`** — gameplay starts. Do gameplay init here (spawning, timers, delegate bindings),56 **not** in the constructor.575. `Tick(DeltaSeconds)` — per-frame, only if ticking is enabled (see [Ticking](#ticking)).586. **`EndPlay(Reason)`** — leaving play (destroyed, level change, PIE end, app shutdown);59 clean up timers/delegates here.607. `Destroyed` (legacy) then `BeginDestroy` / `FinishDestroy` during garbage collection.6162There are three distinct **creation paths** that converge before `BeginPlay`: load-from-disk63(`PostLoad`), Play-in-Editor duplication (`PostDuplicate`), and spawning (`PostActorCreated` →64`OnConstruction`). `PostLoad` and `PostActorCreated` are mutually exclusive. The full flow,65including deferred spawn and the GC sequence, is in66[references/actor-lifecycle.md](references/actor-lifecycle.md).6768Verified in 5.8 (`GameFramework/Actor.h`): `BeginPlay()`:2125, `EndPlay()`:2132,69`PostInitProperties()`:2343, `Tick(float)`:3060, `PreInitializeComponents()`:3124,70`PostInitializeComponents()`:3127, `OnConstruction()`:3445, `Destroyed()`:3569.7172**Constructor vs BeginPlay:** the constructor runs on the CDO and in the editor, with no world.73Never do gameplay logic (spawning, world queries, timers, delegate binding) there — use `BeginPlay`.7475## Authoring an actor with components7677```cpp78// Pickup.h79#pragma once80#include "CoreMinimal.h"81#include "GameFramework/Actor.h"82#include "Pickup.generated.h"8384class USphereComponent;85class UStaticMeshComponent;8687UCLASS()88class MYGAME_API APickup : public AActor89{90 GENERATED_BODY()91public:92 APickup();9394protected:95 virtual void BeginPlay() override;9697 // Overlap handlers must be UFUNCTION() with the exact delegate signature, or AddDynamic fails.98 UFUNCTION()99 void OnOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,100 UPrimitiveComponent* OtherComp, int32 OtherBodyIndex,101 bool bFromSweep, const FHitResult& Sweep);102103 UPROPERTY(VisibleAnywhere) TObjectPtr<USphereComponent> Trigger; // root, collision104 UPROPERTY(VisibleAnywhere) TObjectPtr<UStaticMeshComponent> Mesh; // visual105};106```107108```cpp109// Pickup.cpp110#include "Pickup.h"111#include "Components/SphereComponent.h"112#include "Components/StaticMeshComponent.h"113114APickup::APickup()115{116 PrimaryActorTick.bCanEverTick = false; // default OFF; opt in only if you override Tick117118 Trigger = CreateDefaultSubobject<USphereComponent>(TEXT("Trigger"));119 SetRootComponent(Trigger);120121 Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));122 Mesh->SetupAttachment(Trigger); // attach in the constructor with SetupAttachment123}124125void APickup::BeginPlay()126{127 Super::BeginPlay();128 Trigger->OnComponentBeginOverlap.AddDynamic(this, &APickup::OnOverlap);129}130```131132Key rules:133- `CreateDefaultSubobject<T>(TEXT("UniqueName"))` is **constructor-only**; the names must be unique134 within the actor. It is declared on `UObject` (`CoreUObject/Public/UObject/Object.h`).135- Hold component pointers in `UPROPERTY() TObjectPtr<T>` members so the GC keeps them alive and136 they show in the editor. A raw `T*` UPROPERTY also works but `TObjectPtr` is the modern form.137- Set the root with `SetRootComponent` (or assign `RootComponent`). The actor's world transform138 comes from its root.139- In the constructor, attach with `SetupAttachment(Parent)`. At runtime, use `AttachToComponent`.140- Forward-declare component classes in the header and `#include` the concrete component headers in141 the `.cpp` to keep header dependencies light.142143## Spawning actors at runtime144145```cpp146FActorSpawnParameters Params;147Params.Owner = this;148Params.SpawnCollisionHandlingOverride =149 ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;150151APickup* P = GetWorld()->SpawnActor<APickup>(PickupClass, Location, Rotation, Params);152153// Deferred spawn: set properties/expose-on-spawn values before BeginPlay runs154AThing* T = GetWorld()->SpawnActorDeferred<AThing>(ThingClass, Transform);155T->Damage = 50.f;156T->FinishSpawning(Transform); // runs construction → PostInitializeComponents → BeginPlay157```158159- `PickupClass` is typically a `UPROPERTY(EditAnywhere) TSubclassOf<APickup>` so designers pick the160 Blueprint subclass. Spawning the C++ class directly skips Blueprint-authored defaults/components.161- Use **deferred spawn** when the actor needs values set *before* `BeginPlay` (e.g. a projectile's162 damage/owner). Plain `SpawnActor` runs the constructor and `BeginPlay` immediately.163- `GetWorld()` can be null on the CDO/in the constructor — only spawn from gameplay code.164165Full spawn-parameter fields, collision-handling values, and destroy/pooling guidance:166[references/spawning-and-destroying.md](references/spawning-and-destroying.md).167168## Adding components at runtime169170```cpp171UStaticMeshComponent* Extra = NewObject<UStaticMeshComponent>(this);172Extra->SetupAttachment(GetRootComponent()); // or AttachToComponent if already registered173Extra->RegisterComponent(); // REQUIRED so it ticks/renders/collides174```175176Runtime components **must** be `RegisterComponent()`-ed — registration is what associates a177component with the world/scene so it can update, render, and collide. Default subobjects created in178the constructor are registered for you during the actor's spawn. Registering many components during179play has a cost; prefer creating them as default subobjects when you can.180181## Attachment182183```cpp184// Runtime attach/detach (scene components only):185Mesh->AttachToComponent(Target, FAttachmentTransformRules::SnapToTargetIncludingScale, SocketName);186Mesh->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);187188// Whole-actor attach (attaches this actor's root to another actor/component):189AttachToActor(OtherActor, FAttachmentTransformRules::KeepRelativeTransform);190```191192- `SetupAttachment` is for the constructor / not-yet-registered components; `AttachToComponent`193 attaches immediately and is for play. Using `SetupAttachment` at runtime does nothing without194 registration.195- Attachment rules choose, per channel, whether to keep the world transform or snap to the196 parent/socket. A component can have many children but only one parent; cycles are not allowed.197198Attachment rules, sockets, mobility, and relative-vs-world transforms:199[references/attachment-and-transforms.md](references/attachment-and-transforms.md).200201## Ticking202203- Actors: set `PrimaryActorTick.bCanEverTick = true;` in the constructor, then override `Tick`.204- Components: set `PrimaryComponentTick.bCanEverTick = true;` then override `TickComponent`.205- Both default to **off**. `bCanEverTick` only makes ticking *possible*; you can toggle it at206 runtime with `PrimaryActorTick.SetTickFunctionEnable(true/false)`.207- Prefer events/timers (`ue-timers-and-async`) over ticking when you can — ticking everything is a208 common performance sink. Leave `bCanEverTick = false` for actors that don't need per-frame work.209210## Finding components211212```cpp213UStaticMeshComponent* M = GetComponentByClass<UStaticMeshComponent>(); // first of class214TArray<USceneComponent*> All;215GetComponents<USceneComponent>(All); // all of class216```217218## Gotchas219220- **Gameplay logic in the constructor** — runs on the CDO/editor with no world; use `BeginPlay`.221- **Overlap/hit handler not a `UFUNCTION()`** — `AddDynamic` silently fails to fire; the bound222 function must be a `UFUNCTION()` with the *exact* delegate signature.223- **Forgot `RegisterComponent()`** on a runtime component → it won't render/collide/tick.224- **Attaching a non-scene component** — only `USceneComponent`+ can attach or have a transform.225- **`SetupAttachment` at runtime** does nothing without registration; use `AttachToComponent`.226- **No overlaps firing** — the primitive needs collision enabled and `SetGenerateOverlapEvents(true)`227 on both components, with overlapping collision responses.228- **No cleanup in `EndPlay`** — timers/delegates referencing this actor can dangle; clear them.229 `EndPlay` runs for *all* exit reasons, so it's the right place (not `Destroyed`).230- **Static mobility moved at runtime** — only `Movable` components can be transformed during play;231 setting transform on a `Static` component is ignored/asserts.232- **Spawning into a blocked location** can fail and return null; set a collision-handling override.233234## Version notes235236- `TObjectPtr<T>` is the current idiom for object UPROPERTYs (UE5+); older code uses raw `T*`,237 which still works. See `ue-memory-and-gc`.238- The lifecycle callbacks and component model here are stable across UE5; line numbers in citations239 drift between patch releases, but the header paths and class/function names are stable.240241## References & source material242243Engine source (UE 5.8, under `Engine/Source/Runtime/`):244- `Engine/Classes/GameFramework/Actor.h` — `AActor` lifecycle, `RootComponent`:1024,245 `PrimaryActorTick`:318, `SetRootComponent`:2493, `AttachToActor`:2029, `FinishSpawning`:3117,246 `GetComponentByClass`:3796.247- `Engine/Classes/Components/ActorComponent.h` — `UActorComponent`, `RegisterComponent`:1322,248 `OnRegister`:830, `InitializeComponent`:919, `BeginPlay`:936, `TickComponent`:976,249 `PrimaryComponentTick`:177, `bWantsInitializeComponent`:340.250- `Engine/Classes/Components/SceneComponent.h` — transforms, `SetupAttachment`:734,251 `AttachToComponent`:752, `DetachFromComponent`:786, `Mobility`:303.252- `Engine/Classes/Components/PrimitiveComponent.h` — rendering/collision, `OnComponentBeginOverlap`:1468,253 `SetGenerateOverlapEvents`:418, `SetCollisionEnabled`:2026.254- `Engine/Classes/Engine/World.h` — `SpawnActor`/`SpawnActorDeferred`:3851, `FActorSpawnParameters`:420.255- `Engine/Classes/Engine/EngineTypes.h` — `FAttachmentTransformRules`:75, `EEndPlayReason`:3670,256 `ESpawnActorCollisionHandlingMethod`:4411.257- `CoreUObject/Public/UObject/Object.h` — `CreateDefaultSubobject`:151.258259Official docs (UE 5.8):260- Actor Lifecycle — <https://dev.epicgames.com/documentation/unreal-engine/unreal-engine-actor-lifecycle>261- Components — <https://dev.epicgames.com/documentation/unreal-engine/components-in-unreal-engine>262- Actors — <https://dev.epicgames.com/documentation/unreal-engine/actors-in-unreal-engine>263- Spawning and Destroying an Actor —264 <https://dev.epicgames.com/documentation/unreal-engine/spawning-and-destroying-unreal-engine-actors>265- Actor Ticking — <https://dev.epicgames.com/documentation/unreal-engine/actor-ticking-in-unreal-engine>266267Deep-dive references in this skill:268- [references/actor-lifecycle.md](references/actor-lifecycle.md) — full creation paths, component269 init sub-sequence, end-of-life and garbage collection.270- [references/components-and-registration.md](references/components-and-registration.md) — type271 hierarchy, registration/render/physics state, `InitializeComponent` vs `BeginPlay`, ticking.272- [references/attachment-and-transforms.md](references/attachment-and-transforms.md) — attachment273 APIs, transform rules, sockets, mobility.274- [references/spawning-and-destroying.md](references/spawning-and-destroying.md) — spawn variants,275 spawn parameters, deferred spawn, destruction, pooling.