69. UE5 RPG 使用Gameplay Cue 实现技能表现效果

在上一章中,我们实现了敌人的攻击技能的特效和音效。如果我们在多人模式下打开,发现,其它客户端看不到对应的效果。
造成这种问题的原因是因为敌人的技能是运行在服务器端的,它只复制到拥有它的客户端,而敌人的效果对于客户端来说,它们都不拥有此内容,所以无法查看到。
那么如何实现每个客户端都可以查看到和听到所需的效果呢,这里就需要使用gameplay Cue去实现了。它可以实现让每个客户端都能获得同样的视效和音效。

创建GameplayCue

右键点击创建蓝图,搜索gameplaycue。
我们会发现对应的可以创建两种GameplayCue,一种是集成至Actor,它是被实例化的,并且可以做到每一帧更新状态和数据。另一种静态的,是无法被实例化,对于一次性的效果很有用。
在这里插入图片描述
我们这里选择GameplayCueNotify_Static作为基类,创建通过通知实现。
在这里插入图片描述
我们以简写GC为前缀,表示它是一个GameplayCue,这个作为受击的效果。
在这里插入图片描述
进入蓝图,选择重载On Execute,在技能被触发时,将触发此节点的回调。
在这里插入图片描述
我们打开传递过来的参数,发现有很多的配置项,这些都是我们在调用时可以设置的。
在这里插入图片描述
我们通过Source object获取到角色的受伤特效,生成一个粒子特效
在这里插入图片描述

触发Gameplay Cue

现在,我们创建了一个GC,还没有实现对其的触发,让其播放特效。如果要实现特效的播放,我们需要通过标签去触发。
打开项目设置,GameplayTag标签管理器,有一个GameplayCue,这个是专门用于设置GC使用的标签地方。
在这里插入图片描述
我们在下面添加一个受击特效标签
在这里插入图片描述
然后回到GC里面设置,你会发现,在这里只能选择GameplayCue下面的标签,我们选中标签
在这里插入图片描述
这样就实现了GC的制作,我们回到技能蓝图中,要能够触发GC,我们使用Execute GameplayCue Width Params On Owner节点,这个可以通过设置Tag来选择需要激活的标签,并且还能够传入配置项
在这里插入图片描述
然后,我们将节点拖出,制作一个配置项,并将所需的内容设置上去
在这里插入图片描述
在客户端查看效果即可。可以看到在客户端也能触发特效表现。
在这里插入图片描述

修改敌人技能蒙太奇标签

接下来,我们要实现敌人技能的音效在多个客户端上面触发,音效是设置在蒙太奇的结构体当中的,查看配置项,我们是无法直接将配置项传递的。
在这里插入图片描述
所以,我们需要修改结构体,增加一个技能独有的索引,并实现一个函数,通过标签去获取对应的结构体数据。
首先我们在C++里面将标签改掉
在这里插入图片描述
之前的Montage标签修改为战斗接口标签

	FGameplayTag CombatSocket_Weapon; //使用武器攻击部位标签FGameplayTag CombatSocket_RightHand; //右手攻击部位标签FGameplayTag CombatSocket_LeftHand; //左手攻击部位标签

在cpp文件中将注册代码也修改掉

	/** CombatSocket*/GameplayTags.CombatSocket_Weapon = UGameplayTagsManager::Get().AddNativeGameplayTag(FName("CombatSocket.Weapon"),FString("使用武器攻击部位标签"));GameplayTags.CombatSocket_LeftHand = UGameplayTagsManager::Get().AddNativeGameplayTag(FName("CombatSocket.LeftHand"),FString("左手攻击部位标签"));GameplayTags.CombatSocket_RightHand = UGameplayTagsManager::Get().AddNativeGameplayTag(FName("CombatSocket.RightHand"),FString("右手攻击部位标签"));

然后我们增加对于动作设置新的索引,在标签中新增,这里我们新增四个

	//使用攻击动作索引FGameplayTag Montage_Attack_1; FGameplayTag Montage_Attack_2;FGameplayTag Montage_Attack_3;FGameplayTag Montage_Attack_4;

对UE中进行注册
/*
* Montage Attack Index
*/

GameplayTags.Montage_Attack_1 = UGameplayTagsManager::Get().AddNativeGameplayTag(FName("Montage.Attack.1"),FString("第1个蒙太奇攻击标签"));GameplayTags.Montage_Attack_2 = UGameplayTagsManager::Get().AddNativeGameplayTag(FName("Montage.Attack.2"),FString("第2个蒙太奇攻击标签"));GameplayTags.Montage_Attack_3 = UGameplayTagsManager::Get().AddNativeGameplayTag(FName("Montage.Attack.3"),FString("第3个蒙太奇攻击标签"));GameplayTags.Montage_Attack_4 = UGameplayTagsManager::Get().AddNativeGameplayTag(FName("Montage.Attack.4"),FString("第4个蒙太奇攻击标签"));

接下来,我们在结构体中,增加一个部位的设置,原来的用来设置索引

//蒙太奇动画和标签以及骨骼位置的映射,用于攻击技能获取和设置攻击范围
USTRUCT(BlueprintType)
struct FTaggedMontage
{GENERATED_BODY()//使用的蒙太奇UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)UAnimMontage* Montage = nullptr;//当前数据的索引UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)FGameplayTag MontageTag;//部位对应的标签UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)FGameplayTag SocketTag;//攻击时的触发伤害的骨骼插槽UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)FName CombatTipSocketName; //设置技能释放的位置//攻击时的触发音效UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)USoundBase* ImpactSound = nullptr;
};

接着将代码中使用到的地方修改掉
在这里插入图片描述
然后编译,修改UE蓝图中使用的内容
在技能蓝图中,修改使用接收信息的标签
在这里插入图片描述
去蓝图中,修改每个角色的攻击蒙太奇的数据,
在这里插入图片描述
然后点击进入对应的蒙太奇,修改对应的位置标签
在这里插入图片描述
我们将这四个怪物都修改掉,技能有近战攻击和远程攻击两个需求把标签修改掉。修改完成运行查看效果是否有问题,主要查看技能是否都能够正确触发,技能释放的位置是否正确。

实现播放音效的GameplayCue

在上面,我们修改完成了标签重构工作。最后,我们还需要实现一个通过标签从结构体数组中获取对应的结构体。
在战斗接口中增加一个函数

	UFUNCTION(BlueprintNativeEvent, BlueprintCallable)FTaggedMontage GetTaggedMontageByTag(const FGameplayTag& MontageTag); //通过标签获取对应的结构体

然后在角色基类里面覆写它

virtual FTaggedMontage GetTaggedMontageByTag_Implementation(const FGameplayTag& MontageTag) override;

在cpp里面实现函数,我们只需要遍历数组,判断MontageTag即可

FTaggedMontage ARPGCharacter::GetTaggedMontageByTag_Implementation(const FGameplayTag& MontageTag)
{for(FTaggedMontage TaggedMontage : AttackMontage){if(TaggedMontage.MontageTag.MatchesTagExact(MontageTag)){return TaggedMontage;}}return FTaggedMontage();
}

编译打开UE,我们接着创建一个新的GC,用来播放攻击音效
这里,我们需要传入一个TagContainer(标签集合)一个位置,以及释放技能的角色,通过标签集合获取到使用的MontageTag,然后去获取结构体,然后通过结构体内的音效配置项和位置进行播放音效。
在这里插入图片描述

标签这里,我也创建了一个新的标签
在这里插入图片描述
接下来,就是将此部分替换掉
在这里插入图片描述
我们将其替换成通过标签触发GC
在这里插入图片描述
如果你不确定有没有问题,可以在GC里面打印音效名称
在这里插入图片描述
查看是否能够成功打印对应的名称
在这里插入图片描述

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

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

相关文章

30、 shell脚本进阶

shell脚本ifcase 一、条件测试 1.1、条件测试:$?----返回码,判断命令或者脚本是否执行成功(最近的一条) 0 true 为真就是成功 成立 非0 false 失败或者异常。 二、test命令 test命令:可以进行条件测试&#xff…

Python内存管理与垃圾回收机制

目录 一、引言 二、Python内存管理概述 三、引用计数机制 四、垃圾回收机制 标记-清除(Mark-and-Sweep) 分代收集(Generational Collection) 五、内存泄漏与优化 六、总结 一、引言 Python作为一门高级编程语言&#xff…

Wells Fargo 借助 MongoDB 推出下一代银行卡支付

MongoDB客户案例导读 MongoDB以其灵活的数据模型、高性能的实时分析能力和可扩展的分布式架构,帮助Wells Fargo富国银行显著提升了数据处理效率和业务响应速度,为其大型机现代化和数字化转型提供了强有力的技术支撑。 金融服务市场正在经历一场变革&am…

像备份Windows一样简单的ghost软件!

数据的安全性对于个人用户和企业来说都至关重要。尤其是运行着重要服务的Linux系统,一旦遇到系统崩溃或硬件故障,如果没有及时的备份,可能会导致不可估量的损失。这时,一款强大而易用的备份还原工具就显得尤为重要。G4L(Ghost for Linux)就是这样一款专为Linux系统设计的…

2024年数字技术与智慧教育国际会议(DTSE 2024,7月26-28)

2024年数字技术与智慧教育国际会议(DTSE 2024)将于2024年7月26日在广东省广州市召开,本次会议专注于“数字技术与智慧教育”领域, 将汇集全球范围内的学者、研究人员以及教育技术开发者,共同探索和分享该领域内的最新学…

实验12 路由重分布

实验12 路由重分布 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 在大型网络的组建过程中,隶属不同机构的网络部分往往会根据自身的实际情况来选用路由协议。例如,有些网络规模很小,为了管理简单&…

比特币私钥公钥地址生成

比特币私钥公钥地址生成算法 原理 实现 #!coding:utf8#author:yqq #date:2019/3/4 0004 14:35 #description: 比特币地址生成算法import hashlib import ecdsa import os#2019-05-15 添加私钥限制范围 g_b58 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz#g…

Linux Radix tree简介

文章目录 前言一、Radix tree简介二、Operations2.1 Lookup2.2 Insertion2.3 Deletion 三、Linux内核API3.1 初始化3.2 radix_tree_insert/delete3.3 radix_tree_preload3.4 radix_tree_lookup3.5 radix_tree_tag_set3.6 radix_tree_tagged 四、address_space4.1 简介4.2 相应数…

使用Arrays.asList 报错Nullpointerexception 需要提前对参数进行判空

//为什么这样的时候会报空指针异常**Arrays.asList 这里这个方法中的参数为空**String[] checkedResourceNos1 dto.getCheckedResourceNos();List<String> checkedResourceNos null; //需要在这里**判断是否为空**&#xff0c;**不为空才能**调**用Arrays.asList转化为…

IC验证中有符号浮点数的运算(避坑)

如上图&#xff0c;仅第一种表达才能计算出正确的结果-180&#xff0c;另外两种方式存在缺少符号和溢出的错误&#xff0c;计算出的均是180&#xff0c;其中reg[31:0] theta_q31 h8000_0000。 如果 theta_q31 h8000_0000到h7fff_ffff之间的数时&#xff0c;上述第一种表达仅能…

暗色系B端界面有什么好处、应用场景、缺点、该如何设计。

B端管理系统界面蓝色系和浅色系的非常多&#xff0c;暗色系一般不作为首选&#xff0c;这背后是什么原因呢&#xff0c;如果真的要设计暗色系界面&#xff0c;该如何办呢&#xff0c;本文就解决这些问题。 一、暗色系B端界面相对于浅色系有什么好处 1. 减少眩光和视觉疲劳&am…

国学诗词app开发,学古贯今,句句珠玑

“鹅鹅鹅&#xff0c;曲项向天歌。”这是很多人学会的第一首诗&#xff0c;国学诗词作为中华传统文化的重要组成部分&#xff0c;不仅在历史中占据重要地位&#xff0c;也是儿童学前启蒙的不二选择。对于家长来说&#xff0c;他们更喜欢在学前教孩子一些经典国学和古诗词&#…

高考后的抉择:计算机相关专业的未来发展与前景探讨

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

使用C#快速搭建一个在windows运行的exe应用

文章目录 一、前言1.1 编写语言需要工具1.2 选择自己需要的组件进行安装 二、新建项目1.1 新建一个 .NET4.x 的项目1.2 添加一个小案例1.3 对界面进行美化1.3.1、配置Form属性1.3.2、配置Button按钮 1.4 查看组将的相关代码 三、后记 一、前言 这是一个比较旧的内容&#xff0…

【android】json

设置第potition个数据项的view的属性 成功显示数据项&#xff0c;熟悉recycleview三个方法 新建页面&#xff0c;定义适配器&#xff0c;指定使用MyViewHolder类对象保存每个数据胡view组件 padding-内部边距 bold-加粗 新建类&#xff0c;描述新闻内容 定义组件 public i…

模拟信号转RS-485/232,数据采集A/D转换模块 YL21

特点&#xff1a; ● 模拟信号采集&#xff0c;隔离转换 RS-485/232输出 ● 采用12位AD转换器&#xff0c;测量精度优于0.1% ● 通过RS-485/232接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压3000VDC ● 宽电源供电范围&#xff1a;8 ~ 32VDC ● 可靠性高&…

网络安全 - ARP 欺骗原理+实验

APR 欺骗 什么是 APR 为什么要用 APR A P R \color{cyan}{APR} APR&#xff08;Address Resolution Protocol&#xff09;即地址解析协议&#xff0c;负责将某个 IP 地址解析成对应的 MAC 地址。 在网络通信过程中会使用到这两种地址&#xff0c;逻辑 IP 地址和物理 MAC 地址&…

如何保证数据库和缓存的一致性

背景&#xff1a;为了提高查询效率&#xff0c;一般会用redis作为缓存。客户端查询数据时&#xff0c;如果能直接命中缓存&#xff0c;就不用再去查数据库&#xff0c;从而减轻数据库的压力&#xff0c;而且redis是基于内存的数据库&#xff0c;读取速度比数据库要快很多。 更新…

android studio过滤日志

荣耀手机的日志有很多乱七八糟的输出 在logcat设置过滤 filter name:过滤名称随意 log tag不知道是什么 log message设置过滤的内容或者设置显示的内容 需要过滤的内容&#xff1a; ^(?!.*(gralloc4|InputMethodManager|tagSocket|dataspace)).*$以|分割要过滤的内容 要显…

计算机网络(2) 网络层:IP服务模型

一.Internet Protocol在TCP/IP四层模型中的作用 第三层网络层负责数据包从哪里来到哪里去的问题。传输层的数据段提交给网络层后&#xff0c;网络层负责添加IP段&#xff0c;包含数据包源地址与目的地址。将添加IP段的数据包交由数据链路层添加链路头形成最终在各节点传输中所需…