首页 > 其他分享 >unreal engine 4 生成Actor及实例化UObject对象

unreal engine 4 生成Actor及实例化UObject对象

时间:2022-12-15 20:32:45浏览次数:65  
标签:engine UObject 实例 对象 Actor 生成 RF unreal 模板


UWorld::SpawnActor()方法生成一个我们想要的物体对象。除了这个方法,还有几个更方便的模板方法可以使用。

同样的UObject类也有一些模板方法来实例化对象。



On this page:



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​

可选的。拥有所生成的 Actor 的 ​​AActor​

​Instigator​

可选的。​​APawn​​ ,导致所生成的 Actor 施加伤害的挑衅者。

​bNoFail​

可选的。一个布尔值,决定了如果某些条件不满足,生成Actor是否失败。如果为 ​​true​​ ,那么生成过程将会失败,因为所生成的类是 ​​bStatic=true​​ ,或者因为模板 Actor 和正在生成的 Actor 的类不一样。

​OverrideLevel​

可选的。在其中生成 Actor 的 ​​ULevel​​ ,也就是 Actor 的外部容器。如果没有指定关卡,那么则使用使用 ​​Owner​​的 ​​Outer(外部容器)​​ 。如果没有指定  ​​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);

如果我们要造建一个UObject的实例,这里也有一些模板可以用:



NewObject

​NewObject()​​是最为简单的UObject工厂模式。它需要可选的外部对象和类,并会创建拥有自动生成的名称的新实例。

template< class T >
T* NewObject
(
UObject* Outer=(UObject*)GetTransientPackage(),
UClass* Class=T::StaticClass()
)

参数 

描述 

​外部​

可选。​​UObject​​作为被创建的 对象 的外部参数。

​类​

可选。​​UClass​​定义待创建的 对象 类。


返回值


指向指定类生成实例的指针。

NewNamedObject

​NewNamedObject()​​​展开于​​NewObject()​​​,通过对新实例,​​对象标识​​以及模板对象命名,从而被作为参数定义。

template< class TClass >
TClass* NewNamedObject
(
UObject* Outer,
FName Name,
EObjectFlags Flags = RF_NoFlags,
UObject const* Template=NULL
)

参数 

描述 

​外部​

​UObject​​作为被创建的 对象 的外部参数。

​名称​

​FName​​ 作为新 对象 的 ​​名称​​参数。

​标志​

可选。​​FObjectFlags​​枚举值描述新 对象 。

​Template​

可选的。​​UObject​​在创建新 对象 时被作为模板使用。


返回值


指向指定类生成实例的指针。

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
)

参数 

描述 

​类​

​UClass​​定义待创建的 对象 类。

​外部​

可选。​​UObject​​作为被创建的 对象 的外部参数。

​名称​

可选。​​FName​​ 作为新 对象 的 ​​名称​​参数。

​设置标识​

可选。​​EObjectFlags​​枚举值描述新 对象 。

​Template​

可选的。​​UObject​​在创建新 对象 时被作为模板使用。

​bCopyTransientsFromClassDefaults​

可选。​​布尔值​​决定是否从类默认对象而不是传入的原型指针处来复制临时属性。如此值为​​真​​,将使用类默认对象的临时值。

​FObjectInstancingGraph​

可选。​​FObjectInstancingGraph​​结构包含对实例化对象和组件到其模板的映射。在由新 对象 所拥有的组件进行实例化时使用。


返回值


指向指定类生成实例的指针。

对象标识

​EObjectFlags​​ 枚举值用来快速并简洁地描述 对象 。对象 类型,垃圾回收如何处理该类型以及 对象 在其生命周期的哪个阶段等信息都有不同的标识进行描述。同时还有特殊的全局蒙版/无蒙版以及预定义的标识组。

标识 

值 

描述 


对象类型


RF_Public

​0x00000001​

对象 在其其所包含的包外可见。

RF_Standalone

​0x00000002​

尽管没有被任何函数引用, 对象 也被保存用来编辑。

RF_Native

​0x00000004​

对象 为native类。这仅用于​​UClass​​对象。

RF_Transactional

​0x00000008​

对象 为交互的。

RF_ClassDefaultObject

​0x00000010​

对象 是其类的默认对象,例如,在被创建时该类使用的默认模板的新实例。

RF_ArchetypeObject

​0x00000020​

对象 为其他对象的模板。它被作为类默认对象处理。

RF_Transient

​0x00000040​

对象 没有被存储到硬盘上。


垃圾回收


RF_RootSet

​0x00000080​

即使没有被任何函数引用, 对象 也不会被垃圾回收。

RF_IsLazyReferenced

​0x00000100​

对象 由缓慢的指针引用并且在删除时需要额外的清理。

RF_Unreachable

​0x00000200​

该 对象 在对象图表上无法获得。

RF_TagGarbageTemp

​0x00000400​

对象 由使用垃圾回收的不同工具标记来使用。此标识并不由垃圾回收器本身所定义。


对象生命周期


RF_NeedLoad

​0x00000800​

对象 需要载入。

RF_AsyncLoading

​0x00001000​

对象 正被异步载入。

RF_NeedPostLoad

​0x00002000​

对象 需要被滞后加载。

RF_NeedPostLoadSubobjects

​0x00004000​

对象 仍需要实例化子对象并修复序列化的组件引用

RF_PendingKill

​0x00008000​

对象 正等待销毁。将 对象 在游戏中标记为无效,但仍为有效 对象 。

RF_BeginDestroyed

​0x00010000​

对象 已调用​​BeginDestroy()​​。

RF_FinishDestroyed

​0x00020000​

对象 已调用 ​​FinishDestroy()​​。


特殊蒙板


RF_AllFlags

​0x0003ffff​

对象 拥有所有标识。主要用来检查错误。

RF_NoFlags

​0x00000000​

对象 没有标识。被用来防止转换。


预定义组


RF_Load


​RF_Public | RF_Standalone | RF_Native | RF_Transactional | RF_ClassDefaultObject | RF_ArchetypeObject​


标识被从虚幻文件中载入。

RF_PropagateToSubobjects


​RF_Public | RF_ArchetypeObject | RF_Transactional​



参考:


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​

标签:engine,UObject,实例,对象,Actor,生成,RF,unreal,模板
From: https://blog.51cto.com/u_13760719/5946040

相关文章