六一的部落格


关关难过关关过,前路漫漫亦灿灿。




参照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派生类
  1. 添加数据成员

    -
    GeometryClass1 protected Actor派生类类型
  2. 创建Actor对象,坐标(0, 0, 0)

    1UWorld* World = GetWorld();
    2if (World)
    3{
    4    World->SpawnActor(GeometryClass1);
    5}

SpawnActor<T>: 返回一个指向Actor派生类对象的指针

-
UWorld::SpawnActor<T> 创建给定的Actor派生类对象, 传入Actor派生类和初始变换信息
  1. 添加数据成员

    -
    GeometryClass2 protected Actor派生类类型
  2. 在给定位置创建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>只负责构建对象

  1. 添加数据成员 GeometryClass3

    -
    GeometryClass3 protected Actor派生类类型
    GeometryPayloads protected 数组; 存放多个GeometryObject配置信息; 稍后在虚幻编辑器中配置
  2. 创建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}
  3. 为GeometryObject应用配置

    1Geometry->SetGeometrySetting(Payload);
  4. 对GeometryObject调用BeginPlay

    1Geometry->FinishSpawning(Transform);

创建蓝图类

创建基于GeometryObject的蓝图类,并绑定静态网格体,应用材质

-
BP_GeometryObject_Cube
BP_GeometryObject_Sphere
BP_GeometryObject_Cone

打开蓝图类

双击蓝图类时,如果没有修改,默认显示原型细节面板



在蓝图编辑器中查看继承的数据成员

声明AGeometryObject::GeometrySetting时,在UPROPERTY宏中给出BlueprintReadWrite

  1. 勾选继承成员可见


  2. 将数据成员拖入蓝图中,可以设置或获取该成员,由虚幻引擎提供实现



设置GeometrySetting



获取GeometrySetting



结构体操作: 显示分量

右键,Split Struct Pin




结构体操作: Break

以GetGeometrySetting为例




结构体操作: 收起分量

右键,Recombine Struct Pin



在蓝图编辑器中使用C++函数



动态创建Actor对象



参照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派生类
  1. 添加数据成员

    -
    GeometryClass1 protected Actor派生类类型
  2. 创建Actor对象,坐标(0, 0, 0)

    1UWorld* World = GetWorld();
    2if (World)
    3{
    4    World->SpawnActor(GeometryClass1);
    5}

SpawnActor<T>: 返回一个指向Actor派生类对象的指针

-
UWorld::SpawnActor<T> 创建给定的Actor派生类对象, 传入Actor派生类和初始变换信息
  1. 添加数据成员

    -
    GeometryClass2 protected Actor派生类类型
  2. 在给定位置创建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>只负责构建对象

  1. 添加数据成员 GeometryClass3

    -
    GeometryClass3 protected Actor派生类类型
    GeometryPayloads protected 数组; 存放多个GeometryObject配置信息; 稍后在虚幻编辑器中配置
  2. 创建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}
  3. 为GeometryObject应用配置

    1Geometry->SetGeometrySetting(Payload);
  4. 对GeometryObject调用BeginPlay

    1Geometry->FinishSpawning(Transform);

创建蓝图类

创建基于GeometryObject的蓝图类,并绑定静态网格体,应用材质

-
BP_GeometryObject_Cube
BP_GeometryObject_Sphere
BP_GeometryObject_Cone

打开蓝图类

双击蓝图类时,如果没有修改,默认显示原型细节面板



在蓝图编辑器中查看继承的数据成员

声明AGeometryObject::GeometrySetting时,在UPROPERTY宏中给出BlueprintReadWrite

  1. 勾选继承成员可见


  2. 将数据成员拖入蓝图中,可以设置或获取该成员,由虚幻引擎提供实现



设置GeometrySetting



获取GeometrySetting



结构体操作: 显示分量

右键,Split Struct Pin




结构体操作: Break

以GetGeometrySetting为例




结构体操作: 收起分量

右键,Recombine Struct Pin



在蓝图编辑器中使用C++函数