动态创建Actor对象
2024年1月7日 2024年1月11日
参照SimpleGeometry定义GeometryObject
包含头文件
1#include "Components/StaticMeshComponent.h" 2#include "Materials/MaterialInstanceDynamic.h" 3#include "TimerManager.h"
创建枚举类
EGeometryMoveType
运动类型
已创建EMoveType,同一工程内不能创建同名枚举类
创建结构体
FGeometrySetting
- | |
---|---|
MoveType | 运动类型 |
InitialTransform | 初始变换信息 |
RandomColorFlag | 随机变换颜色: 使能标志 |
RandomColorTimer | 随机变换颜色: 定时器 |
TimerRate | 随机变换颜色: 定时器间隔 |
Amplitude | 正弦运动: 振幅 |
Frequency | 正弦运动: 频率; 旋转步长 |
创建静态日志类型
LogGeometryObject
GeometryObject成员
访问说明符 | |||
---|---|---|---|
GeometrySetting | 数据成员 | protected | GeometryObject配置信息 |
InitGeometrySetting | 函数成员 | private | 初始化GeometrySetting,在构造函数中调用 |
StaticMesh | 数据成员 | public | 静态网格组件 |
InitStaticMesh | 函数成员 | private | 初始化静态网格组件,传入StaticMesh的引用,在构造函数中调用 |
InitInitialTransform | 函数成员 | private | 保存Actor对象初始变换信息, 传入初始变换信息 |
SetMaterialParameter | 函数成员 | private | 设置材质对象颜色参数,传入静态网格组件和颜色参数 |
OnimerRandomColor | 函数成员 | private | 定时器回调函数,生成随机颜色,调用SetMaterialParameter |
InitTimerRandomColor | 函数成员 | private | 初始化定时器,传入定时器描述符和定时器间隔; 若FlagRandomColor为真,在BeginPlay中调用 |
MoveInForce | 函数成员 | private | 传入运动类型,初始变换信息,振幅,频率; 在Tick中调用 |
GetGeometrySetting | 函数成员 | public | 内联函数, 获取配置信息 |
SetGeometrySetting | 函数成员 | public | 内联函数, 设置配置信息 |
定义GeometryHub: 负责GeometryObject的创建和销毁
定义静态日志类型
LogGeometryHub
包含头文件
- | |
---|---|
AActor::GetWorld | Engine/World.h |
1#include "Engine/World.h"
动态创建Actor对象
SpawnActor: 返回一个指向Actor的指针
- | |
---|---|
UWorld::SpawnActor | 创建给定的Actor派生类对象, 传入Actor派生类 |
-
添加数据成员
- GeometryClass1 protected Actor派生类类型 -
创建Actor对象,坐标(0, 0, 0)
1UWorld* World = GetWorld(); 2if (World) 3{ 4 World->SpawnActor(GeometryClass1); 5}
SpawnActor<T>: 返回一个指向Actor派生类对象的指针
- | |
---|---|
UWorld::SpawnActor<T> | 创建给定的Actor派生类对象, 传入Actor派生类和初始变换信息 |
-
添加数据成员
- GeometryClass2 protected Actor派生类类型 -
在给定位置创建Actor对象, 保存指向Actor派生类对象的指针
1UWorld* World = GetWorld(); 2if (World) 3{ 4 const FTransform Transform = FTransform(FRotator::ZeroRotator, FVector(0.0f, 300.0f, 300.0f)); 5 AGeometryObject* Geometry = World->SpawnActor<AGeometryObject>(GeometryClass2, Transform); 6}
SpawnActorDeferred<T>: 返回一个指向Actor派生类对象的指针, 延后对Actor派生类对象调用BeginPlay
SpawnActor和SpawnActor<T>在构建完Actor派生类对象后, 对对象调用了BeginPlay
SpawnActorDeferred<T>只负责构建对象
-
添加数据成员 GeometryClass3
- GeometryClass3 protected Actor派生类类型 GeometryPayloads protected 数组; 存放多个GeometryObject配置信息; 稍后在虚幻编辑器中配置 -
创建Actor对象
1UWorld* World = GetWorld(); 2if (World) 3{ 4 int i = 0; 5 for (const FGeometrySetting &Payload : GeometryPayloads) 6 { 7 const FTransform Transform = 8 FTransform(FRotator::ZeroRotator, FVector(0.0f, 300.0f * (i++), 800.0f)); 9 AGeometryObject* Geometry = World->SpawnActorDeferred<AGeometryObject>(GeometryClass3, Transform); 10 } 11}
-
为GeometryObject应用配置
1Geometry->SetGeometrySetting(Payload);
-
对GeometryObject调用BeginPlay
1Geometry->FinishSpawning(Transform);
创建蓝图类
创建基于GeometryObject的蓝图类,并绑定静态网格体,应用材质
- |
---|
BP_GeometryObject_Cube |
BP_GeometryObject_Sphere |
BP_GeometryObject_Cone |
打开蓝图类
双击蓝图类时,如果没有修改,默认显示原型细节面板
在蓝图编辑器中查看继承的数据成员
声明AGeometryObject::GeometrySetting时,在UPROPERTY宏中给出BlueprintReadWrite
-
勾选继承成员可见
-
将数据成员拖入蓝图中,可以设置或获取该成员,由虚幻引擎提供实现
设置GeometrySetting
获取GeometrySetting
结构体操作: 显示分量
右键,Split Struct Pin
结构体操作: Break
以GetGeometrySetting为例
结构体操作: 收起分量
右键,Recombine Struct Pin
在蓝图编辑器中使用C++函数