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也是一样被赋予了上述属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460848.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qgis 开发初级 《ToolBox》

Qgis 有个ToolBox 的,在Processing->ToolBox 菜单里面,界面如下。 理论上Qgis这里面的工具都是可以用脚本或者C 代码调用的。界面以Vector overlay 为例子简单介绍下使用方式。Vector overlay 的意思是矢量叠置分析,和arcgis软件类似的。点…

Docker可视化工具 Portainer 安装及配置

文章目录 拉取镜像安装和启动容器访问 Portainer设置密码完后即代表安装完毕安装完成 拉取镜像 rootyx-PowerEdge-R730:~# docker pull portainer/portainer Using default tag: latest latest: Pulling from portainer/portainer Digest: sha256:47b064434edf437badf7337e516…

Oracle视频基础1.1.4练习

1.1.4 dbb,ddabcPMON,SMON,LGWR,CKPT,DBWna5,b4,c2,d3,e1ad,a,c,b,eOracle instance,Oracle databaseSGA,background processcontrol file,data file,online redo file 以下是一篇关于 Oracle 基础习题 1.1.4 的博客: Oracle 基础习题解析:1.1.4 本篇文…

每日读则推(十四)——Meta Movie Gen: the most advanced media foundation models to-date

premiere n.首映,首次公演 v.首次公演(戏剧、音乐、电影) a.首要的,最早的 Today we’re premiering Meta Movie Gen: the most advanced media foundation models to-date. 迄今,到现在为止 …

uniapp实现【时间戳转换为日期格式(年-月-日 时-分-秒)】

这是接口返回的数据: 转换成日期格式 具体代码: <view class="time">{{formatDate(res.data.time)}

前端代码注释

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言类注释属性注释函数注释函数参数注释解构 & 函数返回结果 注释Vue Props 注释注释建议注释内容要清晰简洁注释类型避免不必要的注释采用一致的风格版本与更…

[ 问题解决篇 ] 解决windows虚拟机安装vmtools报错-winserver2012安装vmtools及安装KB2919355补丁 (附离线工具)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

安娜的档案(Anna’s Archive) 镜像网站/国内最新可访问入口(持续更新)

安娜的档案&#xff08;Anna’s Archive&#xff09;是一个颇受关注的资源库。它涵盖了广泛的内容&#xff0c;可能包括各类文献、资料等。其特色在于丰富的信息储备和一定的系统性。安娜的档案&#xff08;Anna’s Archive&#xff09;用户可以从中获取多样的知识和数据&#…

【p2p、分布式,区块链笔记 分布式容错算法】: 拜占庭将军问题+实用拜占庭容错算法PBFT

papercodehttps://pmg.csail.mit.edu/papers/osdi99.pdfhttps://github.com/luckydonald/pbft 其他相关实现&#xff1a;This is an implementation of the Pracltical Byzantine Fault Tolerance protocol using PythonAn implementation of the PBFT consensus algorithm us…

系统架构图设计(行业领域架构)

物联网 感知层&#xff1a;主要功能是感知和收集信息。感知层通过各种传感器、RFID标签等设备来识别物体、采集信息&#xff0c;并对这些信息进行初步处理。这一层的作用是实现对物理世界的感知和初步处理&#xff0c;为上层提供数据基础网络层&#xff1a;网络层负责处理和传输…

简缩极化模型+简缩极化求解用优化的方法,也需要保证方程和未知数个数

一个定标器可以得到一个复数矢量&#xff0c;4个实数方程 而模型中我们有&#xff0c;每个定标器有不同的A和φ (两个实数)和相同的R和δc &#xff08;4个复数&#xff09;

paimon实战 -- Changelog Producer到底有什么用?

目的 Chaneglog producer 的主要目的是为了在 Paimon 表上产生流读的 changelog, 所以如果只是批读的表是可以不用设置 Chaneglog producer 的。 一般对于数据库如 MySQL 来说, 当执行的语句涉及数据的修改例如插入、更新、删除时&#xff0c;MySQL 会将这些数据变动记录在 b…

Istio基本概念及部署

一、Istio架构及组件 Istio服务网格在逻辑上分为数据平面和控制平面。 控制平面&#xff1a;使用全新的部署模式&#xff1a;Istiod&#xff0c;这个组件负责处理Sidecar注入&#xff0c;证书颁发&#xff0c;配置管理等功能&#xff0c;替代原有组件&#xff0c;降低复杂度&…

支付宝自动扣款如何关闭服务

支付宝作为我们日常生活中常用的支付工具&#xff0c;不仅方便快捷&#xff0c;还提供了自动扣款服务。然而&#xff0c;有时候我们可能会因为不再需要某项服务&#xff0c;或者其他原因&#xff0c;需要关闭这些自动扣款服务。本文将详细介绍如何在支付宝中关闭自动扣款服务。…

Java爬虫:在1688上“照片快递”上传图片

想象一下&#xff0c;你是一名快递小哥&#xff0c;不过你送的不是包裹&#xff0c;而是图片——而且是用Java编写的爬虫作为你的快递车&#xff0c;将图片快速准确地送到1688的服务器上。今天&#xff0c;我们将一起化身为代码界的“照片快递”&#xff0c;使用Java爬虫技术&a…

Windows安装Git最新保姆级教程【附安装包】

一、Git下载: 链接&#xff1a;https://pan.baidu.com/s/1_uH-_-cdBb6GD58oLcxvAA 提取码&#xff1a;m366 二、安装Git 1.右键桌面【此电脑】-【属性】&#xff0c;查看操作系统是32位还是64位。 2.下载好对应64位操作系统版本的Git&#xff0c;解压并打开。 我电脑系统是64位…

vue3父子组件传值,子组件暴漏方法

1.父传子 defineProps 父组件直接通过属性绑定的方式给子组件绑定数据&#xff0c;子组件通过defineProps接收函数接收 其中v-model是完成事件绑定和事件监听的语法糖。v-model算是v-bind和v-on的简洁写法&#xff0c;等价于 <c-input ref"inputRef" :modelValue…

2024年,Rust开发语言,现在怎么样了?

Rust开发语言有着一些其他语言明显的优势&#xff0c;但也充满着争议&#xff0c;难上手、学习陡峭等。 Rust 是由 Mozilla 主导开发的通用、编译型编程语言&#xff0c;2010年首次公开。 在 Stack Overflow 的年度开发者调查报告中&#xff0c;Rust 连续多年被评为“最受喜爱…

【C++动态规划】有效括号的嵌套深度

本文涉及知识点 C动态规划 LeetCode1111. 有效括号的嵌套深度 有效括号字符串 定义&#xff1a;对于每个左括号&#xff0c;都能找到与之对应的右括号&#xff0c;反之亦然。详情参见题末「有效括号字符串」部分。 嵌套深度 depth 定义&#xff1a;即有效括号字符串嵌套的层…

医院信息化与智能化系统(14)

医院信息化与智能化系统(14) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…