12. UE5 RPG使用GameplayEffect修改角色属性(三)

书接 11. UE5 RPG使用GameplayEffect修改角色属性(二)
前面,介绍了GameplayEffect的Instant和Duration的使用,这一篇主要介绍一下无限制时间类型的infinite的使用方式。
无限时间限制模式下,如果你的周期时间(Period)为0,那就是相当于增加了一个状态加了一个Buff,效果是持续的,如果周期时间你设置了值,那么它将变成为每个周期执行一次Instant效果的GameplayEffect。
使用起来基本上和有时间限制的Duration一样,它们的区别在于,一个是有时间限制的,另一个是没有时间限制。

应用场景

  1. 可以使用到地面陷阱,比如地上的岩浆,角色站在上面会一直掉血,离开后,通过清除GameplayEffect来取消效果。
  2. 恢复水泉,角色站在旁边可以一直恢复。
  3. 无限制时间的buff,比如装备提供的buff,角色特有的属性bufff。

接下来,我们要制作一个通用的类,里面可以设置这三种属性的GameplayEffect,在蓝图里面,只需要设置何时触发效果即可。并且实现一下Infinite效果的添加和删除功能。

首先我们要添加两个枚举,用于设置添加的类在何时应用到actor身上

//效果应用状态枚举
UENUM(BlueprintType) 
enum class EEffectApplicationPolicy
{ApplyOnOverlap,ApplyOnEndOverlap,DoNotApply
};//效果移除的状态枚举
UENUM(BlueprintType) 
enum class EEffectRemovalPolicy
{RemoveOnEndOverlap,DoNotRemove
};

接着修改配置项的类,每一种GameplayEffect的类,Instant和Duration只有添加时的策略配置,(它们两个一个是瞬间效果,另一个是有时效性的,都不需要主动移除),Infinite的则需要设置添加策略和移除策略。

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")TSubclassOf<UGameplayEffect> InstantGameplayEffectClass; //生成GameplayEffect的类UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")EEffectApplicationPolicy InstantEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")TSubclassOf<UGameplayEffect> DurationGameplayEffectClass; //生成具有一定持续时间的GameplayEffect的类UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")EEffectApplicationPolicy DurationEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")TSubclassOf<UGameplayEffect> InfinityGameplayEffectClass; //生成具有一定持续时间的GameplayEffect的类UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")EEffectApplicationPolicy InfinityEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")EEffectRemovalPolicy InfinityEffectRemovalPolicy = EEffectRemovalPolicy::RemoveOnEndOverlap;

接着,我们需要创建两个函数,可以在蓝图中调用,触发overlap和endoverlap时的相关事件

	//在重叠开始时处理效果的添加删除逻辑UFUNCTION(BlueprintCallable) void OnOverlap(AActor* TargetActor);//在重叠结束时处理效果的添加删除逻辑UFUNCTION(BlueprintCallable) void OnEndOverlap(AActor* TargetActor);

在Overlap事件中,如果你设置了对应的需要在Overlap时添加效果,将去执行ApplyEffectToTarget()函数应用效果。

void AEffectActorBase::OnOverlap(AActor* TargetActor)
{if(InstantEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap){ApplyEffectToTarget(TargetActor, InstantGameplayEffectClass);}if(DurationEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap){ApplyEffectToTarget(TargetActor, DurationGameplayEffectClass);}if(InfinityEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap){ApplyEffectToTarget(TargetActor, InfinityGameplayEffectClass);}
}

ApplyEffectToTarget()函数之前也讲过,这里有了更改,就是对于Infinite类型的效果并且在重叠结束时需要销毁的效果,我们需要将其的引用保存下来,因为它不会自己取消,需要手动去销毁。

void AEffectActorBase::ApplyEffectToTarget(AActor* TargetActor, TSubclassOf<UGameplayEffect> GameplayEffectClass)
{/*** 默认自己编写从actor身上获取ASC的方式* IAbilitySystemInterface* ASCInterface = Cast<IAbilitySystemInterface>(TargetActor); //判断当前actor是否有技能系统接口if(ASCInterface){UAbilitySystemComponent* TargetASC = ASCInterface->GetAbilitySystemComponent(); }*///获取ASCUAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);if(TargetASC == nullptr) return;check(GameplayEffectClass);//创建Effect的句柄 包含了实例化Effect所需数据FGameplayEffectContextHandle EffectContextHandle = TargetASC->MakeEffectContext();//设置创建Effect的对象EffectContextHandle.AddSourceObject(this);//Effect的实例化后的句柄,可以通过此来寻找调用const FGameplayEffectSpecHandle EffectSpecHandle = TargetASC->MakeOutgoingSpec(GameplayEffectClass, 1.f, EffectContextHandle);//从句柄中获取到实例的地址,并被应用。const FActiveGameplayEffectHandle ActiveGameplayEffectHandle = TargetASC->ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get());//从句柄中获取到定义的对象,并判断设置的const bool bIsInfinite = EffectSpecHandle.Data.Get()->Def.Get()->DurationPolicy == EGameplayEffectDurationType::Infinite;//在是无限时间效果和需要在结束时清除掉时,将效果句柄添加到mapif(bIsInfinite && InfinityEffectRemovalPolicy == EEffectRemovalPolicy::RemoveOnEndOverlap){ActiveEffectHandles.Add(ActiveGameplayEffectHandle, TargetASC);}
}

在结束重叠事件函数中,首先逻辑判断是否需要在离开时添加效果。接下来就是判断Infinite类型的效果是否需要在结束重叠事件时移除,如果需要则通过ASC判断相同来找到对应的效果进行移除,在堆栈里面还不能直接移除,所以先将引用保存了下来

void AEffectActorBase::OnEndOverlap(AActor* TargetActor)
{//添加效果if(InstantEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnEndOverlap){ApplyEffectToTarget(TargetActor, InstantGameplayEffectClass);}if(DurationEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnEndOverlap){ApplyEffectToTarget(TargetActor, DurationGameplayEffectClass);}if(InfinityEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnEndOverlap){ApplyEffectToTarget(TargetActor, InfinityGameplayEffectClass);}//删除效果if(InfinityEffectRemovalPolicy == EEffectRemovalPolicy::RemoveOnEndOverlap){UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);if(!IsValid(TargetASC)) return;//创建存储需要移除的效果句柄存储Key,用于遍历完成后移除效果TArray<FActiveGameplayEffectHandle> HandlesToRemove;//循环map内存的数据for(TTuple<FActiveGameplayEffectHandle, UAbilitySystemComponent*> HandlePair : ActiveEffectHandles){//判断是否ASC相同if(TargetASC == HandlePair.Value){//通过句柄将效果移除,注意,有可能有多层效果,不能将其它层的效果也移除掉,所以只移除一层TargetASC->RemoveActiveGameplayEffect(HandlePair.Key, 1);//添加到移除列表HandlesToRemove.Add(HandlePair.Key);}}//遍历完成后,在Map中将移除效果的KeyValue删除for(auto& Handle : HandlesToRemove){ActiveEffectHandles.FindAndRemoveChecked(Handle);}}
}

接着编译打开ue,看到右侧有对应的属性配置
在这里插入图片描述
事件图表更好设置,在对应的碰撞体事件触发回调时链接即可
在这里插入图片描述
GameplayEffect的设置就很简单了,一个持续掉血的效果
在这里插入图片描述
接下来就是测试,运行起来,点击~键,然后输入showdebug abilitysystem 来查看掉血情况
在这里插入图片描述

下面附上上面两个文件的整个代码:
EffectActorBase.h

// 版权归暮志未晚所有。#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "GameplayEffectTypes.h"
#include "EffectActorBase.generated.h"struct FActiveGameplayEffectHandle;
class UAbilitySystemComponent;
class UGameplayEffect;//效果应用状态枚举
UENUM(BlueprintType) 
enum class EEffectApplicationPolicy
{ApplyOnOverlap,ApplyOnEndOverlap,DoNotApply
};//效果移除的状态枚举
UENUM(BlueprintType) 
enum class EEffectRemovalPolicy
{RemoveOnEndOverlap,DoNotRemove
};/*** 在场景中可放置的影响角色属性的物件基类*/
UCLASS()
class AURA_API AEffectActorBase : public AActor
{GENERATED_BODY()public:	AEffectActorBase();protected:// 游戏开始或生成对象时回调virtual void BeginPlay() override;//给与目标添加GameplayEffect效果UFUNCTION(BlueprintCallable) void ApplyEffectToTarget(AActor* TargetActor, TSubclassOf<UGameplayEffect> GameplayEffectClass);//在重叠开始时处理效果的添加删除逻辑UFUNCTION(BlueprintCallable) void OnOverlap(AActor* TargetActor);//在重叠结束时处理效果的添加删除逻辑UFUNCTION(BlueprintCallable) void OnEndOverlap(AActor* TargetActor);UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")TSubclassOf<UGameplayEffect> InstantGameplayEffectClass; //生成GameplayEffect的类UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")EEffectApplicationPolicy InstantEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")TSubclassOf<UGameplayEffect> DurationGameplayEffectClass; //生成具有一定持续时间的GameplayEffect的类UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")EEffectApplicationPolicy DurationEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")TSubclassOf<UGameplayEffect> InfinityGameplayEffectClass; //生成具有一定持续时间的GameplayEffect的类UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")EEffectApplicationPolicy InfinityEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Apply Effects")EEffectRemovalPolicy InfinityEffectRemovalPolicy = EEffectRemovalPolicy::RemoveOnEndOverlap;//用于存储当前已经激活的GameplayEffect的句柄的mapTMap<FActiveGameplayEffectHandle, UAbilitySystemComponent*> ActiveEffectHandles;
};

EffectActorBase.cpp

// 版权归暮志未晚所有。#include "Actor/EffectActorBase.h"
#include "ActiveGameplayEffectHandle.h"
#include "AbilitySystemBlueprintLibrary.h"
#include "AbilitySystemComponent.h"AEffectActorBase::AEffectActorBase()
{// 设置当前对象是否每帧调用Tick()PrimaryActorTick.bCanEverTick = false;SetRootComponent(CreateDefaultSubobject<USceneComponent>("SceneRoot"));
}void AEffectActorBase::BeginPlay()
{Super::BeginPlay();
}void AEffectActorBase::ApplyEffectToTarget(AActor* TargetActor, TSubclassOf<UGameplayEffect> GameplayEffectClass)
{/*** 默认自己编写从actor身上获取ASC的方式* IAbilitySystemInterface* ASCInterface = Cast<IAbilitySystemInterface>(TargetActor); //判断当前actor是否有技能系统接口if(ASCInterface){UAbilitySystemComponent* TargetASC = ASCInterface->GetAbilitySystemComponent(); }*///获取ASCUAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);if(TargetASC == nullptr) return;check(GameplayEffectClass);//创建Effect的句柄 包含了实例化Effect所需数据FGameplayEffectContextHandle EffectContextHandle = TargetASC->MakeEffectContext();//设置创建Effect的对象EffectContextHandle.AddSourceObject(this);//Effect的实例化后的句柄,可以通过此来寻找调用const FGameplayEffectSpecHandle EffectSpecHandle = TargetASC->MakeOutgoingSpec(GameplayEffectClass, 1.f, EffectContextHandle);//从句柄中获取到实例的地址,并被应用。const FActiveGameplayEffectHandle ActiveGameplayEffectHandle = TargetASC->ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get());//从句柄中获取到定义的对象,并判断设置的const bool bIsInfinite = EffectSpecHandle.Data.Get()->Def.Get()->DurationPolicy == EGameplayEffectDurationType::Infinite;//在是无限时间效果和需要在结束时清除掉时,将效果句柄添加到mapif(bIsInfinite && InfinityEffectRemovalPolicy == EEffectRemovalPolicy::RemoveOnEndOverlap){ActiveEffectHandles.Add(ActiveGameplayEffectHandle, TargetASC);}
}void AEffectActorBase::OnOverlap(AActor* TargetActor)
{if(InstantEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap){ApplyEffectToTarget(TargetActor, InstantGameplayEffectClass);}if(DurationEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap){ApplyEffectToTarget(TargetActor, DurationGameplayEffectClass);}if(InfinityEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap){ApplyEffectToTarget(TargetActor, InfinityGameplayEffectClass);}
}void AEffectActorBase::OnEndOverlap(AActor* TargetActor)
{//添加效果if(InstantEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnEndOverlap){ApplyEffectToTarget(TargetActor, InstantGameplayEffectClass);}if(DurationEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnEndOverlap){ApplyEffectToTarget(TargetActor, DurationGameplayEffectClass);}if(InfinityEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnEndOverlap){ApplyEffectToTarget(TargetActor, InfinityGameplayEffectClass);}//删除效果if(InfinityEffectRemovalPolicy == EEffectRemovalPolicy::RemoveOnEndOverlap){UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);if(!IsValid(TargetASC)) return;//创建存储需要移除的效果句柄存储Key,用于遍历完成后移除效果TArray<FActiveGameplayEffectHandle> HandlesToRemove;//循环map内存的数据for(TTuple<FActiveGameplayEffectHandle, UAbilitySystemComponent*> HandlePair : ActiveEffectHandles){//判断是否ASC相同if(TargetASC == HandlePair.Value){//通过句柄将效果移除,注意,有可能有多层效果,不能将其它层的效果也移除掉,所以只移除一层TargetASC->RemoveActiveGameplayEffect(HandlePair.Key, 1);//添加到移除列表HandlesToRemove.Add(HandlePair.Key);}}//遍历完成后,在Map中将移除效果的KeyValue删除for(auto& Handle : HandlesToRemove){ActiveEffectHandles.FindAndRemoveChecked(Handle);}}
}

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

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

相关文章

Android meminfo 查看方法及解析

目录 Android 上查看memory 信息的方法 内存限制的信息 手动释放缓存 例 adb shell dumpsys meminfo pid 解析 adb shell dumpsys meminfo 汇总信息说明 Total RAM Free RAM ION Used RAM Lost RAM ZRAM /proc/meminfo 参考文档 Android 上查看memory 信息的方法 …

vscode配置wsl ubuntu c++的环境

在ubuntu安装llvm/clang sudo apt install llvm clang clangd lldb vscode的调试器接口是按GDB开发的&#xff0c;所以需要一个适配器&#xff0c;lldb-mi就是这个适配器。lldb-mi原来是llvm项目的一部分&#xff0c;后面成为了一个单独的项目https://github.com/lldb-tools/…

【Docker】.NET Core 6.0 webapi 发布上传到Docker Desktop并启动运行访问,接口返回数据乱码解决方法

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

C语言——联合体类型

&#x1f4dd;前言&#xff1a; 在前面两篇文章&#xff1a;C语言——结构体类型&#xff08;一&#xff09;和C语言——结构体&#xff08;二&#xff09;中&#xff0c;我们讲述了C语言中重要的数据类型之一&#xff1a;结构体类型&#xff0c;今天我们来介绍一下C语言中的另…

C语言数组元素的引用

存储模式&#xff1a;一片连续的内存&#xff0c;按数据类型分割成若干相同大小的格子元素下标&#xff1a;数组开头位置的偏移量&#xff0c;a[0]引用第1个格子&#xff0c;a[1]引用第2个格子&#xff0c;以此类推 int a[5]; // 有效的下标范围是 0 ~ 4 a[0] 1; a[1] 2; a[2…

【机器学习】科学库使用手册第2篇:机器学习任务和工作流程(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论人工智能相关知识。主要内容包括&#xff0c;了解机器学习定义以及应用场景&#xff0c;掌握机器学习基础环境的安装和使用&#xff0c;掌握利用常用的科学计算库对数据进行展示、分析&#xff0c;学会使用jupyter note…

linux 自动定时清理缓存

文章目录 1&#xff0c;查看内存占用情况&#xff1a;1.1、free和available的区别&#xff1f;1.2、交换分区的作用&#xff1f; 2&#xff0c;手动清理命令3&#xff0c;定时自动清理3.1&#xff0c;创建文件夹3.2&#xff0c;新建文件cleanBuffer.sh3.3&#xff0c;添加内容3…

Transformer实战-系列教程2:Transformer算法解读2

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 Transformer实战-系列教程1&#xff1a;Transformer算法解读1 Transformer实战-系列教程2&#xff1a;Transformer算法解读2 5、Multi-head机制 在4中我们的输入是X&#x…

【保姆级教程|YOLOv8改进】【5】精度与速度双提升,使用FasterNet替换主干网络

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

重写Sylar基于协程的服务器(6、HOOK模块的设计)

重写Sylar基于协程的服务器&#xff08;6、HOOK模块的设计&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日志模…

大数据Zookeeper--案例

文章目录 服务器动态上下线监听案例需求需求分析具体实现测试 Zookeeper分布式锁案例原生Zookeeper实现分布式锁Curator框架实现分布式锁 Zookeeper面试重点选举机制生产集群安装多少zk合适zk常用命令 服务器动态上下线监听案例 需求 某分布式系统中&#xff0c;主节点可以有…

CentOS 8 安装配置 Hadoop3.3.6 伪分布式安装方式(适用于开发和调试)

1.配置服务器ssh免密登录&#xff0c;否则后面启动会报错&#xff1a;尝试通过SSH连接到主机出现认证错误的提示 配置服务器ssh免密登录&#xff1a; 1.生成SSH密钥对&#xff08;如果尚未生成&#xff09;&#xff1a; 执行下面的命令生成密钥对&#xff0c;一直回车即可 ssh…

为后端做准备

这里写目录标题 flask 文件上传与接收flask应答&#xff08;接收请求&#xff08;文件、数据&#xff09;flask请求&#xff08;上传文件&#xff09;传递参数和文件 argparse 不从命令行调用参数1、设置default值2、"从命令行传入的参数".split()3、[--input,内容] …

代码随想录day18--二叉树的应用6

LeetCode530.二叉搜索树的最小绝对差值 题目描述&#xff1a; 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,6,1,3] …

CSDN2024年我的创作纪念日1024天|不忘初心|努力上进|积极向前

CSDN2024年我的创作纪念日1024天| 学习成长机遇&#xff1a;学习成长收获&#xff1a;2023年度总结数据&#xff1a;2024新领域的探索&#xff1a;日常和自己的感慨&#xff1a;2024憧憬和规划&#xff1a;创作纪念日总结&#xff1a; 学习成长机遇&#xff1a; 大家好&#x…

SpringBoot-基础篇03

之前搭建了整个开发环境实现了登录注册&#xff0c;springBoot整合mybatis完成增删改查&#xff0c;今天完成分页查询&#xff0c;使用阿里云oss存储照片等资源&#xff0c;后期会尝试自己搭建分布式文件系统来实现。 一&#xff0c;SpringBootMybatis完成分页查询 1&#xff…

天线阵列车载应用——第1章 介绍 1.1节 汽车工业中的天线阵列:应用和频率范围

1.1 汽车工业中的天线阵列:应用和频率范围 无线通信系统的发展需要新的技术来支持更高质量的通信、新的服务和应用。近年来&#xff0c;汽车无线通信市场得到了极大的扩展。现代汽车使用不同的服务:AM/FM收音机、卫星广播(SDARS)、移动电话通信、数字音频广播(DAB)、远程无钥匙…

零基础学编程从入门到精通,系统化的编程视频教程上线,中文编程开发语言工具构件之缩放控制面板构件用法

一、前言 零基础学编程从入门到精通&#xff0c;系统化的编程视频教程上线&#xff0c;中文编程开发语言工具构件之缩放控制面板构件用法 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载—…

mysql事务锁

Lock - 事务锁 与 latch 的区别 lock对象是事务&#xff0c;用来锁定的是数据库中的对象&#xff0c;如表、行、页。并且一般lock的对象仅在事务commit或rollback后进行释放&#xff08;不同事务隔离级别释放的时间可能不同&#xff09;。此外&#xff0c;lock&#xff0c;正…

3.0 Zookeeper linux 服务端集群搭建步骤

本章节将示范三台 zookeeper 服务端集群搭建步骤。 所需准备工作&#xff0c;创建三台虚拟机环境并安装好 java 开发工具包 JDK&#xff0c;可以使用 VM 或者 vagrantvirtualbox 搭建 centos/ubuntu 环境&#xff0c;本案例基于宿主机 windows10 系统同时使用 vagrantvirtualb…