Bootstrap

Unreal Engine 5 C++(C#)开发:使用蓝图库实现插件(二)编辑BPLibrary.h中的枚举及结构体

目录

引言

 一、头文件编写

1.1Kismet/BlueprintFunctionLibrary.h

1.2BPLibrary.generated.h的作用

1.3IImageWrapper.h

1.4 IImageWrapperModule.h

1.5 Engine/Texture2D.h

1.6CoreMinimal.h

 二、定义图片/路径类型的枚举

2.1图片枚举类EImageType

2.2路径枚举类EPathType

三、创建存储图片信息的FTextureDetail

3.1UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ZGD|TextureReader")


引言

在将我们此次插件要用到的 "ImageWrapper","Core","UMG"模块写入到Build.cs里的PrivateDependencyModuleNames.AddRange后,我们就可以正式开始对我们所创建的TextureReaderBPLibrary.h进行编辑了。

打开TextureReaderBPLibrary.h可以看到以下内容

 将注释删掉后就是UE给我们创建好的.h初始的文件内容:

 一、头文件编写

1.1Kismet/BlueprintFunctionLibrary.h

在Unreal Engine (UE) 中,Kismet/BlueprintFunctionLibrary.h 文件通常与蓝图功能库(Blueprint Function Library)相关。Unreal Engine 允许开发者通过C++编写自定义的函数库,这些函数库可以在蓝图(Blueprint)系统中被调用。这对于扩展蓝图功能、封装复杂逻辑或实现一些C++特有的功能特别有用。

概述

BlueprintFunctionLibrary 是Unreal Engine中的一个基类,用于创建可以在蓝图中使用的静态函数库。这意味着你创建的任何继承自 UBlueprintFunctionLibrary 的类,其静态成员函数都可以在蓝图的“事件图表”或“函数图表”中被调用。

基本步骤

  1. 创建继承自 UBlueprintFunctionLibrary 的类
    首先,你需要在你的UE项目中创建一个新的C++类,并使其继承自 UBlueprintFunctionLibrary

  2. 声明静态函数
    在这个新类中,你可以声明
    静态函数,这些函数将可以在蓝图中被调用。这些函数需要被标记为 UFUNCTION(BlueprintCallable),以指明它们可以在蓝图中使用。

  3. 实现函数
    在类的实现文件(.cpp)中,提供这些静态函数的实现。

  4. 编译项目
    编译你的UE项目后,这些函数将出现在蓝图的函数列表中,你可以像使用其他蓝图节点一样使用它们。

 我们往往可以在.h文件中声明它然后在.c文件中对其进行定义和实现。

头文件(MyBlueprintFunctionLibrary.h)

#pragma once  
  
#include "CoreMinimal.h"  
#include "Kismet/BlueprintFunctionLibrary.h"  
#include "MyBlueprintFunctionLibrary.generated.h"  
  
UCLASS()  
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary  
{  
    GENERATED_BODY()  
  
public:  
    UFUNCTION(BlueprintCallable, Category = "Math")  
    static float AddNumbers(float A, float B);  
};

.c文件(MyBlueprintFunctionLibrary.cpp)

#include "MyBlueprintFunctionLibrary.h"  
  
float UMyBlueprintFunctionLibrary::AddNumbers(float A, float B)  
{  
    return A + B;  
}

1.2BPLibrary.generated.h的作用

在Unreal Engine(UE)中,BPLibrary.generated.h文件是UE的反射系统(Reflection System)针对特定的蓝图函数库(Blueprint Function Library)自动生成的文件。

作用详解

  1. 反射代码生成:TextureReaderBPLibrary.generated.h包含了由UE反射系统生成的反射代码。这些代码使得在C++中定义的函数和类能够被蓝图系统识别并调用。
  2. 蓝图函数暴露:如果我们在TextureReaderBPLibrary类中定义了带有UFUNCTION(BlueprintCallable)宏的静态函数,这些函数将被暴露给蓝图系统。TextureReaderBPLibrary.generated.h中的代码就是实现这一暴露机制的关键部分。
  3. 支持蓝图中的纹理操作:假设TextureReaderBPLibrary类设计用于在蓝图中提供纹理读取和处理的功能,那么TextureReaderBPLibrary.generated.h将确保这些功能可以在蓝图环境中被正确调用。
  4. 提高开发效率:通过使用蓝图函数库和自动生成的.generated.h文件,开发者可以在C++中实现复杂的逻辑,并在蓝图中轻松调用这些逻辑,从而提高开发效率。
  5. 无需直接编辑:作为开发者的我们通常不需要直接编辑TextureReaderBPLibrary.generated.h文件。这个文件是由UE的编译系统自动生成的,当C++源代码发生变化并重新编译项目时,.generated.h文件会相应地更新。

1.3IImageWrapper.h

在Unreal Engine(UE)中,IImageWrapper.h 是一个接口头文件,它定义了一个用于图像处理的通用接口 IImageWrapper。这个接口的主要作用是为不同类型的图像数据提供一个统一的访问和操作方式,使得开发者可以在不依赖于具体图像格式的情况下处理图像。

IImageWrapper 接口提供了一系列函数,允许开发者执行以下操作:

  1. 图像加载和保存
    • 从文件或其他数据源加载图像。
    • 将图像数据保存到文件或其他目标。
  2. 图像数据访问
    • 获取图像的宽度、高度和通道数。
    • 访问和修改图像的像素数据。
  3. 图像格式支持支持多种图像格式(如 PNG、JPG、BMP 等),尽管具体的格式支持是通过实现 IImageWrapper 接口的类来提供的。
  4. 图像操作
    • 基本的图像操作,如调整大小、翻转、旋转等。
    • 图像格式转换(例如,从RGBA转换为灰度图)。
  5. 内存管理提供图像数据的内存管理功能,如分配和释放内存。

在Unreal Engine中,IImageWrapper 接口通常通过具体的实现类来使用,这些实现类根据图像数据的来源和格式进行专门化。例如,FTexture2DMipMap 类可能会提供一个 IImageWrapper 接口的实现,以便从纹理数据中读取或写入图像。

1.4 IImageWrapperModule.h

在Unreal Engine(UE)中,IImageWrapperModule.h 是一个模块接口头文件,它定义了一个名为 IImageWrapperModule 的接口。这个接口的主要作用是为 IImageWrapper 提供模块级别的支持和功能。以下是对 IImageWrapperModule.h 作用的详细解释:

  1. 模块管理IImageWrapperModule 接口允许 Unreal Engine 管理图像处理模块的生命周期和依赖关系。这包括加载、卸载和初始化图像处理模块。
  2. 图像包装器工厂:它提供了一个工厂方法 CreateImageWrapper,用于根据指定的图像格式(如 PNG、JPG、BMP 等)创建 IImageWrapper 接口的实现实例。这使得开发者可以根据需要轻松地创建和使用不同类型的图像包装器。
  3. 格式支持查询IImageWrapperModule 可能还提供了查询支持的图像格式列表的方法,帮助开发者了解哪些图像格式可以被当前安装的模块处理。
  4. 模块配置和扩展:通过 IImageWrapperModule 接口,开发者可以扩展 Unreal Engine 的图像处理功能,添加对新的图像格式或图像处理算法的支持。这有助于保持引擎的灵活性和可扩展性。
  5. 集成和兼容性IImageWrapperModule 接口的设计有助于确保不同图像处理模块之间的兼容性和集成性。它提供了一个标准的接口来访问和操作图像数据,从而简化了模块之间的交互和集成过程。
  6. 资源管理:在某些情况下,IImageWrapperModule 可能还负责图像资源的内存管理和优化。这包括分配和释放图像数据所需的内存,以及确保在处理大量图像数据时保持高效和稳定的性能。

1.5 Engine/Texture2D.h

在Unreal Engine(UE)中,Engine/Texture2D.h 是一个非常重要的头文件,它定义了 UTexture2D 类及其相关功能。UTexture2D 类是 Unreal Engine 中用于表示二维纹理的基类,它提供了一系列的功能和属性,使得开发者能够在引擎中高效地创建、管理和使用纹理。

以下是 Engine/Texture2D.h 作用的一些关键点:

  1. 纹理定义UTexture2D 类定义了二维纹理的基本属性和行为。这包括纹理的尺寸(宽度和高度)、格式(如 RGBA、灰度等)、分辨率、纹理数据等。
  2. 纹理创建和管理
    • 提供了创建和销毁纹理的函数。开发者可以使用这些函数来动态地创建新的纹理对象,并在需要时销毁它们以释放资源。
    • 允许对纹理进行更新和修改。例如,可以更改纹理的像素数据、调整纹理的 Mipmap 级别等。
  3. 纹理渲染UTexture2D 类与 Unreal Engine 的渲染系统紧密集成,使得纹理可以直接用于渲染过程。开发者可以将纹理应用于材质、网格或其他渲染元素上,以实现各种视觉效果。
  4. 纹理资源加载:提供了从文件或其他数据源加载纹理资源的函数。这允许开发者从磁盘、网络或其他位置加载纹理,并将其用于游戏或应用程序中。
  5. 纹理参数设置:允许开发者设置纹理的各种参数,如纹理的压缩设置、SRGB 校正、Mipmap 生成设置等。这些参数对纹理的性能和视觉效果有重要影响。
  6. 纹理数据访问:提供了访问纹理数据的接口。开发者可以读取纹理的像素数据,以便进行进一步的处理或分析。在某些情况下,还可以修改纹理数据以实现动态效果。
  7. 纹理事件和回调:可能还提供了与纹理相关的事件和回调机制。例如,当纹理被加载、更新或销毁时,可以触发特定的事件或回调函数,以便开发者执行相应的操作。

1.6CoreMinimal.h

在Unreal Engine(UE)中,CoreMinimal.h 是一个非常重要的预编译头文件。它的主要作用是包含了一套来自UE核心编程环境的普遍存在类型,这些类型对于引擎的各个部分都是基础且必需的。以下是 CoreMinimal.h 作用的具体解释:

  1. 提供基础类型CoreMinimal.h 包含了诸如 FStringFNameTArray 等核心类型。这些类型在引擎的各个模块和系统中被广泛使用,用于表示字符串、名称、数组等数据结构。
  2. 简化包含关系:由于 CoreMinimal.h 包含了引擎核心编程环境的基础类型,因此多数引擎的头文件都会首先包含它。这样做可以简化头文件之间的包含关系,减少编译时间和依赖复杂性。
  3. 支持IWYU原则:IWYU(Include What You Use)是一个编译时工具,它确保每个头文件仅包含必要的内容。CoreMinimal.h 的设计符合 IWYU 原则,使得开发者可以更加清晰地了解每个头文件所依赖的内容。
  4. 提高代码可读性:通过提供一套标准的基础类型,CoreMinimal.h 有助于提高代码的可读性和一致性。开发者可以更加容易地理解和维护使用这些基础类型的代码。
  5. 支持跨平台开发:由于 Unreal Engine 支持多个平台(如 Windows、Mac、Linux、移动设备等),CoreMinimal.h 中的类型定义和宏定义也考虑到了跨平台兼容性。这使得开发者可以在不同平台上编写和编译相同的代码。
  6. 作为其他头文件的依赖:在 Unreal Engine 的源代码中,许多其他头文件都会依赖 CoreMinimal.h。这是因为 CoreMinimal.h 提供了许多其他头文件所需的类型和宏定义。

 二、定义图片/路径类型的枚举

2.1图片枚举类EImageType

UENUM(BlueprintType)
enum class EImageType:uint8
{
	JPG UMETA(DisplayName = "JPG"),
	PNG UMETA(DisplayName = "PNG"),
	BMP UMETA(DisplayName = "BMP")
};

定义一个使用 UENUM 宏标记的枚举类 EImageType这个枚举类用于表示图像的类型。UENUM 宏是 Unreal Engine(UE)特有的,用于在枚举类型上添加额外的元数据,这些元数据通常用于编辑器集成,比如为枚举值提供友好的显示名称。BlueprintType 参数表明这个枚举可以在 Unreal Engine 的蓝图系统中使用,使得非编程人员也能通过可视化编程界面访问和使用这些枚举值。

2.2路径枚举类EPathType

这段代码定义了一个在Unreal Engine(UE)中使用的枚举类EPathType,它通过UENUM宏被标记为可以在蓝图(Blueprint)系统中使用。枚举类EPathType有两个成员:ABSOLUTERELATIVE,分别代表绝对路径和相对路径。UMETA宏用于为每个枚举成员提供一个在编辑器中显示的友好名称,这里ABSOLUTERELATIVE的显示名称与它们的枚举值名称相同。

UENUM(BlueprintType)
enum class EPathType:uint8
{
	ABSOLUTE UMETA(DisplayName = "ABSOLUTE"),
	RELATIVE UMETA(DisplayName = "RELATIVE")
};
  • UENUM(BlueprintType):这个宏标记了枚举类,使其可以在UE的蓝图系统中被访问和使用。
  • enum class EPathType:uint8:定义了一个名为EPathType的枚举类,它使用uint8作为底层数据类型来存储枚举值。
  • ABSOLUTE UMETA(DisplayName = "ABSOLUTE"):这是枚举类的一个成员,代表绝对路径。UMETA宏为它在编辑器中提供了一个显示名称"ABSOLUTE"。
  • RELATIVE UMETA(DisplayName = "RELATIVE"):这是枚举类的另一个成员,代表相对路径。同样,UMETA宏为它在编辑器中提供了一个显示名称"RELATIVE"。

在Unreal Engine的项目中,这样的枚举类通常用于在代码中定义一组有限的选项,这些选项可以在编辑器的用户界面中以用户友好的方式呈现。由于这个枚举被标记为可以在蓝图中使用,因此它和EImageType一样也可以被非编程人员(如游戏设计师或关卡设计师)用于创建游戏逻辑或配置游戏资产。

三、创建存储图片信息的FTextureDetail

USTRUCT(BlueprintType)
struct FTextureDetail
{
	GENERATED_USTRUCT_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ZGD|TextureReader")
		UTexture2D* Texture;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ZGD|TextureReader")
		int32 Width;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ZGD|TextureReader")
		int32 Heigth;
};

 定义一个在Unreal Engine(UE)中使用的结构体FTextureDetailUE中对结构体的命名习惯通常是使用前缀“F”,该结构体通过USTRUCT宏被标记为可以在蓝图(Blueprint)系统中使用。结构体中包含三个属性:一个指向UTexture2D类型的指针Texture,以及两个整型属性Width和Height每个属性都通过UPROPERTY宏进行了标记,以指定它们的编辑和蓝图访问权限以及所属的类别

以下是对代码的简单描述:

  • USTRUCT(BlueprintType):这个宏标记了结构体,使其可以在UE的蓝图系统中被访问和使用。
  • GENERATED_USTRUCT_BODY():这是一个宏,用于在编译时生成结构体所需的额外代码。在Unreal Engine中,许多U*类型的类(如UObject、UStruct等)都需要这样的宏来生成必要的反射和序列化代码。
  • UPROPERTY宏定义了结构体的三个属性:
    • UTexture2D* Texture:一个指向UTexture2D类型的指针,代表一个二维纹理。该属性被标记为可以在任何地方编辑(EditAnywhere),并且可以在蓝图中读写(BlueprintReadWrite)。它属于"ZGD|TextureReader"类别,这可能是一个自定义的类别名称,用于在编辑器中组织属性。
    • int32 Width:一个整型属性,代表纹理的宽度。它也有相同的编辑和蓝图访问权限,并属于相同的类别。
    • int32 Heigth:一个整型属性,但这里可能是一个拼写错误,通常应该是Height,代表纹理的高度。它同样有相同的编辑和蓝图访问权限,并属于相同的类别。

在Unreal Engine的项目中,这样的结构体通常用于封装与特定功能相关的数据。在我们的插件中,FTextureDetail结构体用于图片有关纹理的详细信息,如图片本身、宽度和高度。由于这个结构体被标记为可以在蓝图中使用,因此它也可以被非编程人员用于在蓝图中创建和配置与纹理相关的逻辑或资产。

3.1UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ZGD|TextureReader")

在Unreal Engine(UE)中,UPROPERTY用于为UObject或其派生类(包括结构体,如果它们被标记为USTRUCT)中的属性提供元数据。这些元数据定义了属性的各种特性,比如它们是否可以在编辑器中编辑、是否可以在蓝图中访问、它们的类别名称等。

GENERATED_USTRUCT_BODY()

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ZGD|TextureReader")
	UTexture2D* Texture;
  • EditAnywhere:这表示该属性可以在Unreal Engine编辑器的任何位置进行编辑。这意味着,一旦这个对象被实例化并放置在编辑器场景中,或者作为某个资产的一部分,用户就可以通过编辑器的界面来修改这个属性的值。

  • BlueprintReadWrite:这表示该属性可以在蓝图中被读取和写入。蓝图是Unreal Engine提供的一种可视化脚本系统,允许非程序员创建和修改游戏逻辑。有了这个标记,蓝图中的节点就可以访问和修改这个属性的值。

  • Category = "ZGD|TextureReader":这为属性指定了一个类别名称,用于在编辑器中组织属性。属性被归类到了"ZGD|TextureReader"这个类别下。这有助于在编辑器界面中更好地组织和查找属性,特别是当对象有很多属性时。

UTexture2D* Texture属性就被赋予了上述的元数据特性。

同样的Width和Height也是一样被赋予了上述属性。

;