UWorld::SpawnActor()方法生成一个我们想要的物体对象。除了这个方法,还有几个更方便的模板方法可以使用。
同样的UObject类也有一些模板方法来实例化对象。
 
 
On this page:
    
- SpawnActor 方法
- 应用
- 生成函数的模板
- 生成T实例, 返回T指针
- 使用变换生成T实例,返回T指针
- 生成类实例, 返回T 指针
- 使用变换生成类实例,返回T指针
   
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
)
| 参数  | 描述  | 
|  | 一个  | 
|  | 可选的。 | 
|  | 可选的。一个  | 
|  | 可选的。一个  | 
|  | 可选的。一个  | 
|  | 可选的。一个   | 
|  | 可选的。 | 
|  | 可选的。拥有所生成的 Actor 的  | 
|  | 可选的。 | 
|  | 可选的。一个布尔值,决定了如果某些条件不满足,生成Actor是否失败。如果为  | 
|  | 可选的。在其中生成 Actor 的  | 
|  | 可选的。一个布尔值,决定是否运行构建脚本。如果为  | 
| 返回值 | |
| 生成的 Actor 是以  | |
应用
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);
如果我们要造建一个UObject的实例,这里也有一些模板可以用:
   
  
NewObject
NewObject()是最为简单的UObject工厂模式。它需要可选的外部对象和类,并会创建拥有自动生成的名称的新实例。
template< class T >
T* NewObject
(
UObject* Outer=(UObject*)GetTransientPackage(),
UClass* Class=T::StaticClass()
)
| 参数  | 描述  | 
|  | 可选。 | 
|  | 可选。 | 
| 返回值 | |
| 指向指定类生成实例的指针。 | |
NewNamedObject
NewNamedObject()展开于NewObject(),通过对新实例,对象标识以及模板对象命名,从而被作为参数定义。
template< class TClass >
TClass* NewNamedObject
(
UObject* Outer,
FName Name,
EObjectFlags Flags = RF_NoFlags,
UObject const* Template=NULL
)
| 参数  | 描述  | 
|  |  | 
|  |  | 
|  | 可选。 | 
|  | 可选的。 | 
| 返回值 | |
| 指向指定类生成实例的指针。 | |
ConstructObject
为达到完全的灵活性,UObjects的新实例可以通过ConstructObject()函数来进行创建。此函数调用分配 对象 的StaticConstructObject()函数,执行 ClassConstructor并执行任何初始化任务,例如载入配置属性,载入本地化属性以及实例化组件。
template< class T >
T* ConstructObject
(
UClass* Class,
UObject* Outer = (UObject*)GetTransientPackage(),
FName Name=NAME_None,
EObjectFlags SetFlags=RF_NoFlags,
UObject const* Template=NULL,
bool bCopyTransientsFromClassDefaults=false,
struct FObjectInstancingGraph* InstanceGraph=NULL
)
| 参数  | 描述  | 
|  |  | 
|  | 可选。 | 
|  | 可选。 | 
|  | 可选。 | 
|  | 可选的。 | 
|  | 可选。 | 
|  | 可选。 | 
| 返回值 | |
| 指向指定类生成实例的指针。 | |
对象标识
EObjectFlags 枚举值用来快速并简洁地描述 对象 。对象 类型,垃圾回收如何处理该类型以及 对象 在其生命周期的哪个阶段等信息都有不同的标识进行描述。同时还有特殊的全局蒙版/无蒙版以及预定义的标识组。
| 标识  | 值  | 描述  | 
| 对象类型 | ||
| RF_Public |  | 对象 在其其所包含的包外可见。 | 
| RF_Standalone |  | 尽管没有被任何函数引用, 对象 也被保存用来编辑。 | 
| RF_Native |  | 对象 为native类。这仅用于 | 
| RF_Transactional |  | 对象 为交互的。 | 
| RF_ClassDefaultObject |  | 对象 是其类的默认对象,例如,在被创建时该类使用的默认模板的新实例。 | 
| RF_ArchetypeObject |  | 对象 为其他对象的模板。它被作为类默认对象处理。 | 
| RF_Transient |  | 对象 没有被存储到硬盘上。 | 
| 垃圾回收 | ||
| RF_RootSet |  | 即使没有被任何函数引用, 对象 也不会被垃圾回收。 | 
| RF_IsLazyReferenced |  | 对象 由缓慢的指针引用并且在删除时需要额外的清理。 | 
| RF_Unreachable |  | 该 对象 在对象图表上无法获得。 | 
| RF_TagGarbageTemp |  | 对象 由使用垃圾回收的不同工具标记来使用。此标识并不由垃圾回收器本身所定义。 | 
| 对象生命周期 | ||
| RF_NeedLoad |  | 对象 需要载入。 | 
| RF_AsyncLoading |  | 对象 正被异步载入。 | 
| RF_NeedPostLoad |  | 对象 需要被滞后加载。 | 
| RF_NeedPostLoadSubobjects |  | 对象 仍需要实例化子对象并修复序列化的组件引用 | 
| RF_PendingKill |  | 对象 正等待销毁。将 对象 在游戏中标记为无效,但仍为有效 对象 。 | 
| RF_BeginDestroyed |  | 对象 已调用 | 
| RF_FinishDestroyed |  | 对象 已调用  | 
| 特殊蒙板 | ||
| RF_AllFlags |  | 对象 拥有所有标识。主要用来检查错误。 | 
| RF_NoFlags |  | 对象 没有标识。被用来防止转换。 | 
| 预定义组 | ||
| RF_Load |  | 标识被从虚幻文件中载入。 | 
| RF_PropagateToSubobjects |  | |
 
参考:
 
Actor实例化
 
https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Actors/Spawning/index.html
 
UObject实例化
 
https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Objects/Creation/index.html










