04-1 产生一个类对象的不同情况(Spawn)

04.1 产生一个类对象的不同情况(Spawn)

​ 在标准C++中,一个类产生一个对象,被称为“实例化”。实例化对象的方法是通过new关键字。

​ 而在虚幻引擎中,这一个问题变得略微复杂。对于某些类型,我们不得不通过调用某些函数来产生出对象。具体而言:

  1. 如果你的类是一个纯C++类型(F开头),你可以通过new来产生对象。

  2. 如果你的类继承自UObject但不继承自Actor,你需要通过NewObject函数来产生出对象。

  3. 如果你的类继承自AActor,你需要通过SpawnActor函数来产生出对象。

NewObject

​ 函数定义如下:

template<class T>
T* NewObject(
UObject* Outer = (UObject*)GetTransientPackage(),
UClass* Class = T::StaticClass(),
FName Name = NAME_None,
EObjectFlags Flags = RF_NoFlags,
UObject* Template = nullptr,
bool bCopyTransientsFromClassDefaults = false,
FObjectInstancingGraph* InInstanceGraph = nullptr
);

​ 使用:

UObject* xxx = NewObject<T>();

SpawnActor

​ 函数定义(其一):

template<class T>
T* SpawnActor(
FVector const& Location,
FRotator const& Rotation,
const FActorSpawnParameters& SpawnParameters = FActorSpawnParameters()
);

​ 使用:

GetWorld()->SpawnActor<AYourActorClass>();

​ **注意点:**最后一个生成参数,会一定程度影响Actor的生成失败(例如与某地形冲突等原因),推荐使用:

FActorSpawnParameters SpawnParams;
SpawnParams.bNoFail = true; // 不会生成失败
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; // 总是生成
// Spawn
GetWorld()->SpawnActor<AEnemy>(Enemy, GetGenerateLocation(), FRotator::ZeroRotator, SpawnParams);