04.1 产生一个类对象的不同情况(Spawn)
在标准C++中,一个类产生一个对象,被称为“实例化”。实例化对象的方法是通过new关键字。
而在虚幻引擎中,这一个问题变得略微复杂。对于某些类型,我们不得不通过调用某些函数来产生出对象。具体而言:
-
如果你的类是一个纯C++类型(F开头),你可以通过new来产生对象。
-
如果你的类继承自UObject但不继承自Actor,你需要通过NewObject函数来产生出对象。
-
如果你的类继承自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;
GetWorld()->SpawnActor<AEnemy>(Enemy, GetGenerateLocation(), FRotator::ZeroRotator, SpawnParams);
|