什么是Actor

Actor是所有可以放置到关卡中对象的基类。

Actor的生命周期是什么

Actor的初始化分为多个步骤。以下是按照执行顺序列出的一些关键回调:

  1. UObject::PostLoad

    1. 对于静态放置在关卡中的Actor,不论在编辑器还是运行时,都会触发这个回调。
    2. 动态实例化的Actor则不会触发
  2. UActorComponent::OnComponentCreated

    1. 对于动态实例化的Actor,不论在编辑器还是在运行时,实例化后,其身上的C++组件会触发这个回调。
    2. 蓝图创建的组件则不会触发这个回调。它会在蓝图构造该组件时触发。
    3. 对于静态放置在关卡中的Actor则不会触发
  3. AActor::PreRegisterAllComponents

    1. 对于拥有C++根组件的Actor,不论是静态放置的,还是动态实例化的。都会触发这个回调。
    2. 对于蓝图类的Actor,并且没有C++根组件的Actor,它会在蓝图构造时触发。
  4. UActorComponent::RegisterComponent

    1. 所有的组件在此时注册,不论在编辑器还是运行时。
    2. 它会创建物理资源渲染资源
    3. 这个函数可能会分帧执行,但是总会PreRegisterAllComponents之后
    4. 这个方法可能会在UnRegisterComponent调用后,从World移除后再次触发。
  5. AActor::PostRegisterAllComponents

    1. 不论在编辑器还是运行时的Actor都会调用这个方法。
    2. 组件注册完成后调用。
  6. AActor::PostActorCreated

    1. 不论在编辑器还是运行时,这个方法会在构造函数之前调用
    2. 静态放置在关卡中的Actor不会触发
  7. AActor::UserConstructionScript

    1. 当蓝图实现了构造函数时调用。
  8. AActor::OnConstruction

    1. ExecuteConstruction的最后调用,该方法调用了蓝图的构造函数。
    2. 这个方法会在蓝图的组件创建并注册完成后触发。
    3. 这个方法只在动态实例化的Actor身上触发,在编辑器可能会在修改蓝图时提前返回。
  9. AActor::PreInitializeComponents

    1. 这个方法会在组件的InitializeComponent方法之前调用
    2. 这个方法只会在gameplay,以及编辑器下特定的预览窗口中调用
  10. UActorComponent::Activate

    1. 这个方法只会在bAutoActivate设置为真时触发。
    2. 这个方法可能会在手动设置bAutoActivate为真时再次触发。
  11. UActorComponent::InitializeComponent

    1. 这个方法会在bWantsInitializeComponentSet时触发。
    2. 这个方法在每次gameplay session只会触发一次。
  12. AActor::PostInitializeComponents

    1. 这个方法在组件初始化完成后触发。
    2. 这个方法只会在gameplay,以及编辑器下特定的预览窗口中调用
  13. AActor::BeginPlay

    1. 会在level开始tick时调用。只会在gameplay时执行。
    2. 通常在PostInitializeComponents之后调用,但是可能会被网络或者Child Actor所推迟

Actor生命周期一览图

ActorLifeCycle1

Actor生命周期官方链接

ActorLifecycle

Actor如何实例化

  1. 对于C++Actor,可以直接使用如下方式:
// 实例化
UWorld* World = GetWorld();
if (World)
{
    FTransform Location = FTransform::Identity;
    AMyActor* MyActor = World->SpawnActor<AMyActor>(AMyActor::StaticClass(), Location);
}
  1. 对于蓝图类,则需要先拿到蓝图类的引用。参考该链接SpawnBlueprintActor
// 拿到蓝图类引用
UPROPERTY(EditAnywhere,Category = "ActorSpawning")
TSubclassOf<AMyActor> BlueprintAMyActorClass;

// 实例化
if(BlueprintAMyActorClass)
{
    UWorld* World = GetWorld();
    if (World)
    {
        AMyActor* BlueprintAMyActor = World->SpawnActor<AMyActor>(BlueprintAMyActorClass, GetTransform(), FActorSpawnParameters());
    }
}
  1. 对于蓝图类,还有一种不需要显示引用蓝图类资产的方法,从官方给出的FPS Cpp范例中可以看到。但是记住ConstructorHelpers只能在构造函数中使用
// 使用字符串路径获得蓝图类
static ConstructorHelpers::FClassFinder<APawn> PlayerPawnClassFinder(TEXT("/Game/FirstPersonCPP/Blueprints/FirstPersonCharacter"));
DefaultPawnClass = PlayerPawnClassFinder.Class;

Actor实例化官方链接

Spawning

Actor如何销毁

BlueprintAMyActor->Destroy();

kivlin
0 声望0 粉丝

游戏开发者