创建AActor派生类对象不要用NewObject或者new,而要用UWorld::SpawnActor()
 

核心代码:


UWorld* World = GetWorld();
 

创建Actors

创建AActor类的实例被称为spawning,可通过泛型函数SpawnActor()或者它的某个模板来实现。

SpawnActor方法

UWorld::SpawnActor()方法只能用来实例化继承自Actor的类。

AActor* UWorld::SpawnActor
(
    UClass*         Class,
    FName           InName,
    FVector const*  Location,
    FRotator const* Rotation,
    AActor*         Template,
    bool            bNoCollisionFail,
    bool            bRemoteOwned,
    AActor*         Owner,
    APawn*          Instigator,
    bool            bNoFail,
    ULevel*         OverrideLevel,
    bool            bDeferConstruction
)
 

下面是对这些参数给出的解释:

参数名 描述
Class 指定要实例化的哪个Actor类。
InName 给实例化的对象指定Name,如果没有指定值,会以[Class]_[Number]格式生成。
Location 提供Actor生成的初始Location的FVector。
Rotation 提供Actor生成的初始Rotation的FRotator。
Template 生成新Actor的模板类,会使用模板类的默认值,如果没有指定,会使用class default object(CDO)。
bNoCollisionFail 在生成Actor的时候决定是否进行碰撞检测,如果设置为True,在生成Actor的时候就不管模板Actor根组件的碰撞设置怎样,都不会进行碰撞检测。
bRemoteOwned actor是否被远程拥有,如果一个actor在客户端被创建需要在服务器上复制的时候就应该设置为True。
Owner 拥有生成Actor的Actor。
Instigator 负责处理生成Actor的伤害处理的APawn。
bNoFail 当某个条件不满足的时候是否还要生成Actor,如果设置为true,生成不会失败因为被生成类bStatic设置为true或者模板类同生成的类不一致。
OverrideLevel 生成Actor的ULevel,比如Actor的外部,如果没有指定,会使用Owner的Outer。如果没有指定Owner,就使用persistent level。
bDeferConstruction 决定构造脚本是否运行,如果设置为true,生成的Actor不会运行构造脚本,只有模板类是蓝图的时候这个选项才可拥。

# 用法

AKAsset* SpawnedActor1 = (AKAsset*) GetWorld()->SpawnActor(AKAsset::StaticClass(), NAME_None, &Location);
 

# Spawn模板

为了让生成Actor更友好,这里提供几个函数模板来应对常见的场景。这让创建Actors更简单因为它们需要更少的参数,也能指定返回的Actor类型。

//第一种 Spawn T Instance, Return T Pointer
/** Spawns and returns class T, respects default rotation and translation of root component. */
template< class T >
T* SpawnActor
(
    AActor* Owner=NULL,
    APawn* Instigator=NULL,
    bool bNoCollisionFail=false
)
{
    return (T*)(GetWorld()->SpawnActor(T::StaticClass(), NAME_None, NULL, NULL, NULL, bNoCollisionFail, false, Owner, Instigator));
}

//使用
MyHUD = SpawnActor<AHUD>(this, Instigator);

//第二种 Spawn T Instance with Transform, Return T Pointer
/** Spawns and returns class T, forcibly sets world position. */
template< class T >
T* SpawnActor
(
    FVector const& Location,
    FRotator const& Rotation,
    AActor* Owner=NULL,
    APawn* Instigator=NULL,
    bool bNoCollisionFail=false
)
{
    return (T*)(GetWorld()->SpawnActor(T::StaticClass(), NAME_None, &Location, &Rotation, NULL, bNoCollisionFail, false, Owner, Instigator));
}

//使用
Controller = SpawnActor<AController>(GetLocation(), GetRotation(), NULL, Instigator, true);

//第三种 Spawn Class Instance, Return T Pointer
/** Spawns given class and returns class T pointer, respects default rotation and translation of root component. */
template< class T >
T* SpawnActor
(
    UClass* Class,
    AActor* Owner=NULL,
    APawn* Instigator=NULL,
    bool bNoCollisionFail=false
)
{
    return (Class != NULL) ? Cast<T>(GetWorld()->SpawnActor(Class, NAME_None, NULL, NULL, NULL, bNoCollisionFail, false, Owner, Instigator)) : NULL;
}

//使用
MyHUD = SpawnActor<AHUD>(NewHUDClass, this, Instigator);

//第四种 Spawn Class Instance with Transform, Return T Pointer
/** Spawns given class and returns class T pointer, forcibly sets world position. */
template< class T >
T* SpawnActor
(
    UClass* Class,
    FVector const& Location,
    FRotator const& Rotation,
    AActor* Owner=NULL,
    APawn* Instigator=NULL,
    bool bNoCollisionFail=false
)
{
    return (Class != NULL) ? Cast<T>(GetWorld()->SpawnActor(Class, NAME_None, &Location, &Rotation, NULL, bNoCollisionFail, false, Owner, Instigator)) : NULL;
}

APawn* ResultPawn = SpawnActor<APawn>(DefaultPawnClass, StartLocation, StartRotation, NULL, Instigator);