🔷 1. AActor::Destroy()
-
触发方式:
蓝图中调用K2_DestroyActor()
→ C++ 调用Destroy()
-
作用:
-
判断当前 Actor 是否可以销毁(如
bCanBeDestroyed
) -
若可以,则调用
DestroyInternal()
-
🔷 2. AActor::DestroyInternal()
-
作用:
-
设置
bPendingKillPending = true
(标记为“等待销毁”) -
通知世界移除此 Actor(从 World 的 Actor 列表中删除)
-
遍历并销毁所有组件:
-
Component->DestroyComponent()
-
Component->UnregisterComponent()
-
断开父子组件关系
-
-
🔷 3. AActor::EndPlay(EEndPlayReason::Destroyed)
-
触发方式:
DestroyInternal()
内部调用 -
作用:
-
通知所有组件调用
EndPlay
,处理逻辑清理 -
触发蓝图的
Event EndPlay
-
清除绑定、计时器、AI 等引用
-
此时组件和外部系统应解除对 Actor 的引用
-
🔷 4. UObject::BeginDestroy()
-
时机:
在 GC 标记阶段未被标记为“活对象”后被调用 -
作用:
-
标记该对象即将被销毁(如释放资源、句柄等)
-
设置
bIsBeingDestroyed = true
-
🔷 5. 等待下一次 GC 运行
-
GC 的触发方式:
-
每隔一段时间自动触发(如每帧计数超过阈值)
-
手动调用
CollectGarbage(GARBAGE_COLLECTION_KEEPFLAGS)
强制触发
-
-
GC 分两步:
-
Mark(标记阶段)
-
从 Root(如 GameInstance、World、UPROPERTY 等)遍历引用链
-
找出所有“可达”的对象并打上标记
-
-
Sweep(清除阶段)
-
对未被标记的对象执行销毁流程:
-
BeginDestroy()
-
IsReadyForFinishDestroy()
-
FinishDestroy()
(真正释放内存)
-
-
-
🔷 6. UObject::FinishDestroy()
-
作用:
-
清除对象内存
-
将其从 UObject 全局对象列表中彻底移除
-
内存被系统回收,对象生命周期终止
-
✅ 总结流程图(简洁版)
K2_DestroyActor() ↓ Destroy() ↓ DestroyInternal() ├─ 组件移除与销毁 ├─ 从世界中移除 └─ EndPlay() ↓ 通知蓝图和组件断引用 ↓ (等待 GC 调用) ↓ BeginDestroy() ↓ GC 判断对象可销毁 ↓ FinishDestroy() ↓ 内存释放,对象彻底销毁
✅ 最终补充说明
-
Destroy 只是“标记销毁”,GC 才是“物理销毁”。
-
引用未断干净的 Actor 无法被 GC 回收,可能造成“幽灵对象”或泄漏。
-
若你写系统管理对象,务必记得手动解绑引用或用
TWeakObjectPtr
等弱引用机制。