作用

动态创建Actor


说明

每个Level持有一个TArray<AActor*> Actors,它用于存放关卡内的所有Actor,因此关卡实际上是一个Actor容器。如果你有看过SpawnActor方法(所有Actor都会经过该方法创建)的代码就一目了然了,它会将创建的Actor放入Level的Actors容器内。

代码

AActor* UWorld::SpawnActor( UClass* Class, FTransform const* UserTransformPtr, const FActorSpawnParameters& SpawnParameters )
{
    ULevel* CurrentLevel = PersistentLevel;
    ULevel* LevelToSpawnIn = SpawnParameters.OverrideLevel;
    if (LevelToSpawnIn == NULL)
    {
        // 如果没有传入指定的关卡,就会指定CurrentLevel.
        LevelToSpawnIn = (SpawnParameters.Owner != NULL) ? SpawnParameters.Owner->GetLevel() : CurrentLevel;
    }
    // 真正创建actor的地方
    AActor* const Actor = NewObject<AActor>(LevelToSpawnIn, Class, NewActorName, ActorFlags, Template, false/*bCopyTransientsFromClassDefaults*/, nullptr/*InInstanceGraph*/, ExternalPackage);
     
    //Add到Level的Actors容器中
    LevelToSpawnIn->Actors.Add(Actor);
    return Actor;
}