创建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);