unreal engine 4 生成Actor及实例化UObject对象
2017-11-03 18:57
3839 查看
想要在UE4中使用代码生成角色,比如一个立方体什么的。可以在GameMode类的结造函数中初始化GameMode实例时通过UWorld的实例的UWorld::SpawnActor()方法生成一个我们想要的物体对象。除了这个方法,还有几个更方便的模板方法可以使用。同样的UObject类也有一些模板方法来实例化对象。
On this page:SpawnActor 方法应用
生成函数的模板生成T实例, 返回T指针
使用变换生成T实例,返回T指针
生成类实例, 返回T 指针
使用变换生成类实例,返回T指针
的类的实例。
参考:Actor实例化https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Actors/Spawning/index.htmlUObject实例化https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Objects/Creation/index.html
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 )
参数 | 描述 |
---|---|
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 |
相关文章推荐
- 黑马程序员------object-c面相对象_类的实例化
- 类,实例,对象,生成对象,实例化对象的区别(精讲)
- 类的实例化:用类来生成对象。
- Unreal Engine 4 C++ 创建对象的几种方法
- Unreal Engine 4 C++ 创建对象的几种方法
- c++在调用类的时候不一定非得实例化对象哦,有时候你不写系统会为你默认生成一个临时实例对象哦~
- 二。ObpAllocateObject 生成对象
- Visual Studio 2013 EF5实体数据模型 EDMX 使用 T4模板生成后使用 ObjectContext对象
- Java中,如何调用“其他类的方法中生成的实例化的对象”的属性?
- Unreal Engine 4 蓝图脚本学习 自定义材质与actor脚本绑定响应碰撞(1)
- java泛型的使用(二)在实例化对象时不指定泛型,则自动识别为object
- 实例化Transform对象与GameObject对象时调用方法时的区别
- PHP“Cannot use object of type stdClass as array” (php在调用json_decode从字符串对象生成json对象时的报错)
- 【cocos2d-x】C++利用类名动态生成对象,类似于Objective-C Class *aclass = [object class]
- Unreal Engine 4 C++ 为编辑器中Actor创建自定义图标
- ECMA object类型实例化、访问对象属性
- 空类生成对象输出的结果是什么? toString()输出 覆写Object toString()方法输出的结果是什么
- Java泛型,结合JSONObject动态生成指定的对象
- SAP Business One 对象类型大全 (Object Type)
- pymongo中如何生成ObjectId