UE Actor生命周期

2023/11 09 08:11

从磁盘加载

摆死在关卡中的Actor,当 UEngine::LoadMap 发生时,或当关卡流送调用 UWorld::AddToWorld 时。

  • 1.从磁盘加载包/关卡中的Actor。
  • 2.序列化的Actor从磁盘加载完成后调用 PostLoad 。所有自定义版本化和修复操作应在此处执行。PostLoad与 AActor::PostActorCreated 互斥。
  • 3.世界调用 UAISystemBase::InitializeActorsForPlay ,以准备Actor启动Gameplay。
  • 4.关卡为未初始化的Actor和无缝行程结转调用 ULevel::RouteActorInitialize 。
  • 5.在Actor的组件上调用InitializeComponent之前调用 AActor::PreInitializeComponents 。
  • 6.UActorComponent::InitializeComponent 是Actor上定义的每个组件的创建辅助函数。
  • 7.在Actor的组件初始化后,调用 AActor::PostInitializeComponents 。
  • 8.关卡启动后,调用 AActor::BeginPlay 。

在编辑器中运行

在”在编辑器中运行(Play in Editor)”路径中,Actor是从编辑器中复制而来,并非从磁盘中加载。然后,复制的Actor按与”从磁盘加载(Load From Disk)”路径中所述的相同流程初始化。

  • 将编辑器中的Actor复制到新世界中。
  • 调用 UObject::PostDuplicate 。
  • UAISystemBase::InitializeActorsForPlay
  • 为未初始化的Actor调用 ULevel::RouteActorInitialize ,涵盖无缝行程结转。
  • 在Actor的组件上调用InitializeComponent之前调用 AActor::PreInitializeComponents 。
  • UActorComponent::InitializeComponent 是Actor上定义的每个组件的创建辅助函数。
  • 在Actor的组件初始化后,调用 AActor::PostInitializeComponents 。
  • 关卡启动后,调用 AActor::BeginPlay 。

手工创建

  • 调用 UWorld::SpawnActor 。
  • 在世界中生成Actor后,调用 AActor::PostSpawnInitialize 。
  • 已生成Actor创建后为其调用 AActor::PostActorCreated ,所有构造函数实现行为应在此发生。PostActorCreated与PostLoad互斥。
  • AActor::ExecuteConstruction :
  • AActor::OnConstruction – Actor的构建,蓝图Actor的组件在此处创建,蓝图变量在此处初始化。
  • AActor::PostActorConstruction :
    • 在Actor的组件上调用InitializeComponent之前调用 AActor::PreInitializeComponents 。
    • UActorComponent::InitializeComponent 是Actor上定义的每个组件的创建辅助函数。
    • 在Actor的组件初始化后,调用 AActor::PostInitializeComponents 。
  • UWorld::OnActorSpawned 在UWorld上播放。
  • 调用 AActor::BeginPlay 。

延迟生成

将任意属性设为”生成时公开(Expose on Spawn)”即可延迟Actor生成。

  1. UWorld::SpawnActorDeferred 旨在生成流程性Actor,允许在蓝图构建脚本之前进行额外设置。
  2. SpawnActor中的所有操作发生,但在 AActor::PostActorCreated 之后发生以下操作:
    1. 通过一个有效但不完整的Actor实例设置并调用多个”初始化函数”。
    2. 调用 AActor::FinishSpawning 以最终确定Actor,在Spawn Actor行中的 AActor::ExecuteConstruction 选取。