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.mzph.cn/pingmian/58464.shtml

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

相关文章

Vuestic 整理使用

简单示例 1. 条件渲染 2. 列表渲染 3. 组件插槽 4. 插值语法 5. 前后端路由的区别(还是转一下,可以减少代码量)SFC 构建 … … Okay,可以干活了,通顺 数据表的操作更加简化了 数据类别通过后端路由区别,但是还得由前端路由转一下 简单了许多呀,上脚手…

ssm017网上花店设计+vue(论文+源码)_kaic

设计题目:网上花店的设计与实现 摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信…

网页上视频没有提供下载权限怎么办?

以腾讯会议录屏没有提供下载权限为例,该怎么办呢? 最好的办法就是找到管理员,开启下载权限。如果找不到呢,那就用这个办法下载。 1.打开Microsoft Edge浏览器的扩展 2.搜索“视频下载”,选择“视频下载Pro” 3.点击“…

使用pyecharts绘制词云图

一、什么是词云图? 词云图是一种用来展现高频关键词的可视化表达,通过文字、色彩、图形的搭配,产生有冲击力地视觉效果,而且能够传达有价值的信息。 制作词云图的网站有很多,简单方便,适合小批量操作。 …

一、ARMv8寄存器之通用、状态、特殊寄存器

ARMV8核心寄存器数量是非常大的,为了更好的学习,可以划分为以下几大类: 通用寄存器。这类寄存器主要是用来暂存数据和参与运算。通过load\store指令操作。状态寄存器。AArch64体系结构使用PSTATE寄存器表示当前处理器状态。特殊寄存器。有专门…

云渲染突破酒店3D动画渲染速度与成本瓶颈!

3D动画已经成为众多行业,尤其是酒店业,用于营销和展示其独特卖点的重要工具。通过生动的3D动画,酒店能够突出其特色和优势,从而吸引更多潜在客户。然而,在3D动画制作过程中,渲染环节往往是一个耗时且技术要…

LabVIEW偏振调制激光高精度测距系统

在航空航天、汽车制造、桥梁建筑等先进制造领域,许多大型零件的装配精度要求越来越高,传统的测距方法在面对大尺寸、高精度测量时,难以满足工业应用的要求。绝对测距技术在大尺度测量上往往会因受环境影响大、测距精度低而无法满足需求。基于…

WPF+MVVM案例实战(六)- 自定义分页控件实现

文章目录 1、项目准备2、功能实现1、分页控件 DataPager 实现2、分页控件数据模型与查询行为3、数据界面实现 3、运行效果4、源代码获取 1、项目准备 打开项目 Wpf_Examples,新建 PageBarWindow.xaml 界面、PageBarViewModel.cs ,在用户控件库 UserControlLib中创建…

WPF+MVVM案例实战(十一)- 环形进度条实现

文章目录 1、运行效果2、功能实现1、文件创建与代码实现2、角度转换器实现3、命名空间引用3、源代码下载1、运行效果 2、功能实现 1、文件创建与代码实现 打开 Wpf_Examples 项目,在Views 文件夹下创建 CircularProgressBar.xaml 窗体文件。 CircularProgressBar.xaml 代码实…

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

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

sublime Text中设置编码为GBK

要在sublime Text中设置编码为GBK,请按照以下步骤操作 1.打开Sublime Text编辑器, 2.点击菜单栏中的“Preferences”(首选项)选项,找打Package Control选项。 3.点击Package Control,随后搜索Install Package并点击,如下图 4.再…

为什么数据库连接很消耗资源?

1背景 开发应用程序久了,总想刨根问底,尤其对一些有公共答案的问题。大家都能解释,但是追根究底,都解释不清。凡是都有为什么,而且用数字说明问题是最直观的。 本文主要想探究一下连接数据库的细节,尤其是…

目标检测:YOLOv11(Ultralytics)环境配置,适合0基础纯小白,超详细

目录 1.前言 2. 查看电脑状况 3. 安装所需软件 3.1 Anaconda3安装 3.2 Pycharm安装 4. 安装环境 4.1 安装cuda及cudnn 4.1.1 下载及安装cuda 4.1.2 cudnn安装 4.2 创建虚拟环境 4.3 安装GPU版本 4.3.1 安装pytorch(GPU版) 4.3.2 安装ultral…

链表(数据结构)

一. 单链表 1.1 概念与结构 再上一篇中我们讲到顺序表,但是顺序表也是有很多的问题,像申请的空间过多过少或者增容该才能不浪费空间,今天我们就来认识一个新的知识,叫做链表,链表也是线性表的一种,链表是…

Docker本地安装Minio对象存储

Docker本地安装Minio对象存储 1. 什么是 MinIO? MinIO 是一个开源的对象存储服务器。这意味着它允许你在互联网上存储大量数据,比如文件、图片、视频等,而不需要依赖传统的文件系统。MinIO 的特点在于它非常灵活、易于使用,同时…

数据结构算法学习方法经验总结

DSA:Data Structures, Algorithms, and Problem-Solving Techniques 三大核心支柱 一次学习一个主题,按照如下顺序学习 如何开始学习新的主题 学习资源 https://www.youtube.com/playlist?listPLDN4rrl48XKpZkf03iYFl-O29szjTrs_O (Algorithms) https://ww…

Java程序设计:spring boot(13)——全局异常与事务控制

1 Spring Boot 事务支持 在使⽤ Jdbc 作为数据库访问技术时,Spring Boot框架定义了基于jdbc的PlatformTransaction Manager 接⼝的实现 DataSourceTransactionManager,并在 Spring Boot 应⽤ 启动时⾃动进⾏配置。如果使⽤ jpa 的话 Spring Boot 同样提供…

vue2和vue3在html中引用组件component方式不一样

我的vue版本是&#xff1a;20.17.0 一、在HTML中&#xff0c;引用组件格式区别。 vue2引用组件可以是file.vue格式&#xff0c;需要导入&#xff1a;<script src"https://unpkg.com/http-vue-loader"></script>才可以识别vue格式。 vue3引用组件格式是…

量子容错计算

基本思想 容错量子计算的基本想法是&#xff0c;在合理编码后的量子态上直接量子计算&#xff0c;以至于不完全需要解码操作。假设有一个简单的量子电路&#xff0c;但不幸的是噪声影响着这个电路的每一个元件&#xff0c;包括量子态的制备、量子逻辑门、对输出的测量&#x…

Redis 哨兵 总结

前言 相关系列 《Redis & 目录》《Redis & 哨兵 & 源码》《Redis & 哨兵 & 总结》《Redis & 哨兵 & 问题》 参考文献 《Redis的主从复制和哨兵机制详解》《Redis中的哨兵&#xff08;Sentinel&#xff09;》《【Redis实现系列】Sentinel自动故…