什么是Actor
Actor是所有可以放置到关卡中对象的基类。
Actor的生命周期是什么
Actor的初始化分为多个步骤。以下是按照执行顺序列出的一些关键回调:
UObject::PostLoad
- 对于静态放置在关卡中的Actor,不论在编辑器还是运行时,都会触发这个回调。
- 动态实例化的Actor则不会触发。
UActorComponent::OnComponentCreated
- 对于动态实例化的Actor,不论在编辑器还是在运行时,实例化后,其身上的C++组件会触发这个回调。
- 而蓝图创建的组件则不会触发这个回调。它会在蓝图构造该组件时触发。
- 对于静态放置在关卡中的Actor则不会触发
AActor::PreRegisterAllComponents
- 对于拥有C++根组件的Actor,不论是静态放置的,还是动态实例化的。都会触发这个回调。
- 对于蓝图类的Actor,并且没有C++根组件的Actor,它会在蓝图构造时触发。
UActorComponent::RegisterComponent
- 所有的组件在此时注册,不论在编辑器还是运行时。
- 它会创建物理资源和渲染资源。
- 这个函数可能会分帧执行,但是总会在
PreRegisterAllComponents
之后 - 这个方法可能会在
UnRegisterComponent
调用后,从World
移除后再次触发。
AActor::PostRegisterAllComponents
- 不论在编辑器还是运行时的Actor都会调用这个方法。
- 组件注册完成后调用。
AActor::PostActorCreated
- 不论在编辑器还是运行时,这个方法会在构造函数之前调用
- 静态放置在关卡中的Actor不会触发
AActor::UserConstructionScript
- 当蓝图实现了构造函数时调用。
AActor::OnConstruction
- 在
ExecuteConstruction
的最后调用,该方法调用了蓝图的构造函数。 - 这个方法会在蓝图的组件创建并注册完成后触发。
- 这个方法只在动态实例化的Actor身上触发,在编辑器可能会在修改蓝图时提前返回。
- 在
AActor::PreInitializeComponents
- 这个方法会在组件的
InitializeComponent
方法之前调用 - 这个方法只会在
gameplay
,以及编辑器下特定的预览窗口中调用
- 这个方法会在组件的
UActorComponent::Activate
- 这个方法只会在bAutoActivate设置为真时触发。
- 这个方法可能会在手动设置bAutoActivate为真时再次触发。
UActorComponent::InitializeComponent
- 这个方法会在bWantsInitializeComponentSet时触发。
- 这个方法在每次
gameplay session
只会触发一次。
AActor::PostInitializeComponents
- 这个方法在组件初始化完成后触发。
- 这个方法只会在
gameplay
,以及编辑器下特定的预览窗口中调用
AActor::BeginPlay
- 会在
level
开始tick时调用。只会在gameplay
时执行。 - 通常在
PostInitializeComponents
之后调用,但是可能会被网络或者Child Actor所推迟
- 会在
Actor生命周期一览图
Actor生命周期官方链接
Actor如何实例化
- 对于C++Actor,可以直接使用如下方式:
// 实例化
UWorld* World = GetWorld();
if (World)
{
FTransform Location = FTransform::Identity;
AMyActor* MyActor = World->SpawnActor<AMyActor>(AMyActor::StaticClass(), Location);
}
- 对于蓝图类,则需要先拿到蓝图类的引用。参考该链接SpawnBlueprintActor
// 拿到蓝图类引用
UPROPERTY(EditAnywhere,Category = "ActorSpawning")
TSubclassOf<AMyActor> BlueprintAMyActorClass;
// 实例化
if(BlueprintAMyActorClass)
{
UWorld* World = GetWorld();
if (World)
{
AMyActor* BlueprintAMyActor = World->SpawnActor<AMyActor>(BlueprintAMyActorClass, GetTransform(), FActorSpawnParameters());
}
}
- 对于蓝图类,还有一种不需要显示引用蓝图类资产的方法,从官方给出的FPS Cpp范例中可以看到。但是记住ConstructorHelpers只能在构造函数中使用
// 使用字符串路径获得蓝图类
static ConstructorHelpers::FClassFinder<APawn> PlayerPawnClassFinder(TEXT("/Game/FirstPersonCPP/Blueprints/FirstPersonCharacter"));
DefaultPawnClass = PlayerPawnClassFinder.Class;
Actor实例化官方链接
Actor如何销毁
BlueprintAMyActor->Destroy();
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。