生成 Actors

SpawnActor 方法

创建一个新的 Actor 示例的过程称为 生成 。生成 Actors 的过程是使用 UWorld::SpawnActor() 函数完成的。该函数创建指定类的一个新实例 并返回到那个新创建的 Actor 的指针。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 一个 UClass ,指出了要生成的 Actor 的类。
InName 可选的。FName ,用作为新生成的 Actor名称 。如果没有指定值,那么则将使用 [Class]_[Number] 的形式自动生成所产生的 Actor 的名称。
Location 可选的。一个 FVector ,提供了生成的 Actor 的初始位置。
Rotation 可选的。一个 FVector ,提供了生成的 Actor 的初始旋转度。
Template 可选的。一个 AActor ,用作为生成新 Actor 时使用的模板。所生成的 Actor 将使用模板 Actor 的属性值进行初始化。如果没有指定模板 Actor ,那么将使用类默认对象(CDO)来初始化所生成的 Actor
bNoCollisionFail 可选的。一个 bool 值,决定生成 Actor 时是否执行碰撞测试。如果为 true ,那么无论根组件或模板 Actor 的碰撞设置为什么,在生成 Actor 时都不执行碰撞测试。
bRemoteOwned 可选的。布尔值
Owner 可选的。拥有所生成的 ActorAActor
Instigator 可选的。APawn ,导致所生成的 Actor 施加伤害的挑衅者。
bNoFail 可选的。一个布尔值,决定了如果某些条件不满足,生成Actor是否失败。如果为 true ,那么生成过程将会失败,因为所生成的类是 bStatic=true ,或者因为模板 Actor 和正在生成的 Actor 的类不一样。
OverrideLevel 可选的。在其中生成 ActorULevel ,也就是 Actor 的外部容器。如果没有指定关卡,那么则使用使用 OwnerOuter(外部容器) 。如果没有指定 Owner ,则使用永久性关卡。
bDeferConstruction 可选的。一个布尔值,决定是否运行构建脚本。如果为 true ,那么将不会在生成的 Actor 上运行构建脚本。仅当正在从 蓝图 中生成 Actor 时适用。

返回值

生成的 Actor 是以 AActor 指针的形式呈现。返回值必须类型转换为 Class 参数指定的衍生类型。

用法

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

生成函数的模板

为了使得生成 Actors 的过程更加方便,我们提供了几个常用的函数模板。这些函数使得创建 Actor 变得更加简单,因为它们仅需要 少量的参数,并允许指定返回的 Actor 的类型。

生成T实例, 返回T指针

这个函数模板在相同的位置处、以相同的旋转度生成该模板类 T 的实例,作为执行生成操作的 Actor 的根组件,并返回 到和那个模板类一样类型的实例的指针,也就是 T* 。您可以指定拥有者 Actor 、挑衅的 Pawn ,及指定如果生成的 Actor 会侵占或碰撞 另一个世界中已经存在的 Actor 生成操作是否失败。

/** 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);

使用变换生成T实例,返回T指针

该函数模板在指定 位置 处使用指定的 旋转度生成模板类 T 的实例,并返回和那个模板类类型一样的实例的指针, 也就是 T* 。除了位置和旋转度外,还可以指定拥有者 Actor 、挑衅的 Pawn ,及指定如果生成的 Actor 会侵占或碰撞 另一个世界中已经存在的 Actor 生成操作是否失败。

/** 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);

生成类实例, 返回T 指针

这个函数模板在相同的位置处、以相同的旋转度生成指定 Class(类) 的实例,作为执行生成操作的 Actor 的根组件,并返回 到和那个模板类一样类型的实例的指针,也就是 T* 。这要求指定的 Class(类) 必须是模板类 T 的子类。除了类外,您还可以指定 拥有者 Actor 、挑衅的 Pawn ,及指定如果生成的 Actor 会侵占或碰撞另一个世界中已经存在的 Actor 生成操作 是否失败。

/** 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);

使用变换生成类实例,返回T指针

该函数模板在指定 位置 处使用指定的 旋转度生成指定类 的实例,并返回和那个模板类类型一样的实例的指针, 也就是 T* 。这要求指定的 Class(类) 必须是模板类 T 的子类。除了类、位置及旋转度外,还可以指定拥有者 Actor 、挑衅的的 Pawn , 及指定如果生成的 Actor 会侵占或碰撞另一个世界中已经存在的 Actor 生成操作

/** 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);