101. UE5 GAS RPG 实现范围技能奥术爆发表现

在上一篇文章里,我们实现了范围技能的范围指示功能。范围指示是在释放技能前,确认技能的攻击范围,在确认位置后,通过额外按键进行触发技能释放。
在这一篇里,我们将先实现在技能里使用范围指示,并能够播放对应的动作,特效和音效。

创建技能蓝图

首先,我们创建一个基于伤害的技能蓝图
在这里插入图片描述
在c++里增加对应技能的标签

FGameplayTag Abilities_Arcane_ArcaneShards; //奥数爆发技能标签

然后注册到标签管理器

	GameplayTags.Abilities_Arcane_ArcaneShards = UGameplayTagsManager::Get().AddNativeGameplayTag(FName("Abilities.Arcane.ArcaneShards"),FString("奥术技能奥术爆发标签"));

接着编译打开UE,在技能蓝图里设置对应标签
在这里插入图片描述
在技能配置表里增加对技能配置
在这里插入图片描述
在技能面板里设置显示对应技能的按钮的标签
在这里插入图片描述
接下来,我们测试一下效果
在这里插入图片描述
接着,我在技能蓝图里边写一些测试功能,来测试技能范围标识的运行效果。
在技能激活时,我们触发技能的显示光圈,然后再次触发时,我们关闭光圈,后面就可以执行技能释放。
在这里插入图片描述
我们在显示光圈时将鼠标隐藏掉,这个需要在角色类里的函数里设置比较方便
在这里插入图片描述

解决移动光圈模糊的问题

这个问题的原因是因为抗锯齿的造成的,在某些游戏里也有相同的问题。
在这里插入图片描述
在项目设置里,找到渲染-默认设置,将抗锯齿修改为祖传的TAA,这种就不会出现残影
在这里插入图片描述
UE里内置了四中抗锯齿
FXAA:通过增加后处理,对图片进行边缘坚持进行模糊处理。
TAA:通过多帧之间的信息来平滑边缘,并结合运动矢量减少锯齿。
MSAA:在光栅化阶段对几何体边缘进行采样,只处理几何体的边缘像素。
TSR:是 UE5 新推出的一种抗锯齿与超分辨率结合的技术,用于在低分辨率渲染时生成高质量画面。
在这里插入图片描述
在这里插入图片描述

添加生成随机的技能生成位置

接下来,我们要实现一个功能,实现多个生成粒子特效的位置,我们需要同意创建一个Actor,然后在里面添加一些场景组件,作为记录对应的位置点来实现。
首先创建一个基于actor的类
在这里插入图片描述
命名
在这里插入图片描述
增加一些对应的配置项,增加十个场景组件和一个默认的actor根组件,创建一个获取场景组件位置的函数。

UCLASS()
class RPG_API APointCollection : public AActor
{GENERATED_BODY()public:	APointCollection();virtual void Tick(float DeltaTime) override;/*** 获取到actor当前世界位置下的多个数量的位置* @param GroundLocation 地面位置* @param NumPoints 需要返回的数量最大10个* @param YawOverride 设置actor旋转的值* @return */UFUNCTION(BlueprintPure)TArray<USceneComponent*> GetGroundPoints(const FVector& GroundLocation, int32 NumPoints, float YawOverride = 0.f);
protected:virtual void BeginPlay() override;/*** 初始化时使用,减少重复代码,创建多个点并添加到根组件下面* @param Pt 创建的场景组件引用* @param Name 场景组件名称*/void CreateSceneComponent(TObjectPtr<USceneComponent>& Pt, FName Name);//存储下面场景组件的数组UPROPERTY(BlueprintReadOnly, VisibleAnywhere)TArray<USceneComponent*> ImmutablePts;//场景的根组件,作为检测位置的根UPROPERTY(BlueprintReadOnly, VisibleAnywhere)TObjectPtr<USceneComponent> Pt_0;UPROPERTY(BlueprintReadOnly, VisibleAnywhere)TObjectPtr<USceneComponent> Pt_1;UPROPERTY(BlueprintReadOnly, VisibleAnywhere)TObjectPtr<USceneComponent> Pt_2;UPROPERTY(BlueprintReadOnly, VisibleAnywhere)TObjectPtr<USceneComponent> Pt_3;UPROPERTY(BlueprintReadOnly, VisibleAnywhere)TObjectPtr<USceneComponent> Pt_4;UPROPERTY(BlueprintReadOnly, VisibleAnywhere)TObjectPtr<USceneComponent> Pt_5;UPROPERTY(BlueprintReadOnly, VisibleAnywhere)TObjectPtr<USceneComponent> Pt_6;UPROPERTY(BlueprintReadOnly, VisibleAnywhere)TObjectPtr<USceneComponent> Pt_7;UPROPERTY(BlueprintReadOnly, VisibleAnywhere)TObjectPtr<USceneComponent> Pt_8;UPROPERTY(BlueprintReadOnly, VisibleAnywhere)TObjectPtr<USceneComponent> Pt_9;UPROPERTY(BlueprintReadOnly, VisibleAnywhere)TObjectPtr<USceneComponent> Pt_10;
};

在构造函数里,我们为场景组件创建实例,将Pt_0作为根节点,然后将其他节点添加到根组件上面

APointCollection::APointCollection()
{PrimaryActorTick.bCanEverTick = false;//设置Pt_0作为根节点Pt_0 = CreateDefaultSubobject<USceneComponent>("Pt_0");ImmutablePts.Add(Pt_0);SetRootComponent(Pt_0);//将其它的场景组件作为根组件的子节点添加,会在蓝图中去修改它的位置CreateSceneComponent(Pt_1, "Pt_1");CreateSceneComponent(Pt_2, "Pt_2");CreateSceneComponent(Pt_3, "Pt_3");CreateSceneComponent(Pt_4, "Pt_4");CreateSceneComponent(Pt_5, "Pt_5");CreateSceneComponent(Pt_6, "Pt_6");CreateSceneComponent(Pt_7, "Pt_7");CreateSceneComponent(Pt_8, "Pt_8");CreateSceneComponent(Pt_9, "Pt_9");CreateSceneComponent(Pt_10, "Pt_10");
}

为了减少重复代码,我们将重复代码抽离成一个函数,实现了场景组件的创建,并添加到数组中,方便遍历。

void APointCollection::CreateSceneComponent(TObjectPtr<USceneComponent>& Pt, const FName Name)
{Pt = CreateDefaultSubobject<USceneComponent>(Name);ImmutablePts.Add(Pt);Pt->SetupAttachment(GetRootComponent());
}

接着就是获取顶点数量和旋转角度,这样可以防止技能特效同质化严重,我们最多支持11个位置获取,并且支持随机角度。

TArray<USceneComponent*> APointCollection::GetGroundPoints(const FVector& GroundLocation, int32 NumPoints, float YawOverride)
{checkf(ImmutablePts.Num() >= NumPoints, TEXT("访问索引超过了数组的范围"));TArray<USceneComponent*> ArrayCopy;for(USceneComponent* Pt : ImmutablePts){if(ArrayCopy.Num() >= NumPoints) return ArrayCopy;if(Pt != Pt_0){FVector ToPoint = Pt->GetComponentLocation() - Pt_0->GetComponentLocation(); //获取到节点基于根组件世界坐标系下的偏移ToPoint = ToPoint.RotateAngleAxis(YawOverride, FVector::UpVector); //对偏移值进行垂直偏移Pt->SetWorldLocation(Pt_0->GetComponentLocation() + ToPoint); //设置偏移后的坐标}//创建拾取坐标使用的起始点和最终位置const FVector RaisedLocation = FVector(Pt->GetComponentLocation().X, Pt->GetComponentLocation().Y, Pt->GetComponentLocation().Z + 500.f);const FVector LoweredLocation = FVector(Pt->GetComponentLocation().X, Pt->GetComponentLocation().Y, Pt->GetComponentLocation().Z - 500.f);//获取到周围过滤的对象TArray<AActor*> IgnoreActors;URPGAbilitySystemLibrary::GetLivePlayersWithinRadius(this, IgnoreActors, TArray<AActor*>(), 1500.f, GetActorLocation());//创建一条直线来拾取地面的坐标FHitResult HitResult;FCollisionQueryParams QueryParams;QueryParams.AddIgnoredActors(IgnoreActors);GetWorld()->LineTraceSingleByProfile(HitResult, RaisedLocation, LoweredLocation, FName("BlockAll"), QueryParams);//通过结果修改节点的位置和朝向const FVector AdjustedLocation = FVector(Pt->GetComponentLocation().X, Pt->GetComponentLocation().Y, HitResult.ImpactPoint.Z);Pt->SetWorldLocation(AdjustedLocation);Pt->SetWorldRotation(UKismetMathLibrary::MakeRotFromZ(HitResult.ImpactNormal));//添加到返回数组内ArrayCopy.Add(Pt);}return ArrayCopy;
}

接着编译打开UE,创建一个对应的蓝图
在这里插入图片描述
为了方便查看场景组件的位置,我们可以在每个场景组件下面添加一个公告板组件
在这里插入图片描述在这里插入图片描述
按照需求摆好一些随机的位置
在这里插入图片描述
修改技能,通过使用通过类生成actor节点生成
在这里插入图片描述
以下是生成测试节点,并防止对应的节点重复调用,我们将节点尽量保存为变量,在获取到位置后,我们绘制一个调试球来查看位置。
在这里插入图片描述
最后运行测试效果。
在这里插入图片描述

延迟生成技能个体

接下来,我们修改技能,让技能能够岔开时间生成,不会造成瞬间生成多个actor导致出现卡顿现象
我们将获取生成个数存储为一个变量
在这里插入图片描述
然后通过使用定时器来每经过一段时间调用事件来实现奥数技能个体的添加,并在设置定时器后,调用一次函数,保证事件触发时能够生成第一个,然后调用debug显示,这里我们后续创建功能可以修改为实际调用。在生成测试球体后,我们判定索引是否超出了数组边界,如果没有超过,则等待下次函数调用,如果超过了,我们将结束技能。
在这里插入图片描述
在结束技能时,我们获取位置的actor销毁,并清除定时器。
在这里插入图片描述

实现奥数爆发个体的技能特效

接下来,我们要通过GameplayCue来实现技能的特效和音效
首先创建一个GameplayCue标签,用于激活
在这里插入图片描述
这里,我们创建一个新的GameplayCue,
GameplayCueNotify_Static适用于简单的、不需要复杂逻辑的 单次效果
GameplayCueNotify_Burst 是 GameplayCueNotify_Static 的一个增强版本,用于 瞬时的“爆发式”效果,并且支持更多的细节配置。
GameplayCueNotify_HitImpact 专门用于处理 击中(Hit)事件 的效果。它通常用来处理攻击命中目标后的反馈,如产生火花、击退、流血等效果。
在这里插入图片描述
对于奥术爆发特效,我们使用GameplayCueNotify_Burst 去实现。
我们可以查看源码,查看对应类拥有的内容
在这里插入图片描述
这个类包含两个内容,一个是在被执行时调用的回调,然后另一个是在蓝图中实现的回调
在这里插入图片描述
执行回调会在内部处理数据,然后调用OnBurst
在这里插入图片描述
我们打开刚才制作的GameplayCue蓝图,在右侧设置对应的标签
在这里插入图片描述
然后书写一些debug信息
在这里插入图片描述
在技能蓝图里,通过当前节点来调用
在这里插入图片描述
设置配置项
在这里插入图片描述
运行查看执行技能时,对应技能是否能够触发。
在这里插入图片描述
接下来,我们配置特效,Brust里带的配置可以让我们配置粒子,音效,相机震动等相关
在这里插入图片描述
我们设置所需的粒子特效和音效,这样,我们就不需要和在GameplayCueNotify_Static里一样,还需要自己手动实现对应效果
在这里插入图片描述
运行查看对应效果
在这里插入图片描述

添加转向和动画

接下来,我们按照之前的思路,实现转向和蒙太奇动画,这里就简短介绍一下,如果想完整查看的,可以看一下之前实现的技能。
创建一个通知标签
在这里插入图片描述
创建一个蒙太奇,并添加Motion Wraping通知和Game Events通知
在这里插入图片描述
在技能里添加对Motion Wraping的朝向设置,以及蒙太奇播放和事件接收通知。
在这里插入图片描述
这样,角色将在动画触发后播放对应的动画,并在接收到通知后触发后续技能特效播放。

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

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

相关文章

硬件基础知识补全计划【一】电阻

一、电阻理论 1.1 电流定义 电流&#xff1a;电流的强弱用电流强度来描述&#xff0c;电流强度是单位时间内通过导体某一横截面的电荷量&#xff0c;简称电流&#xff0c;用I表示。1 秒内有 6.241509310^18 个元电荷通过横截面的电流&#xff0c;定义为 1 安 (A)。 电压&…

Redis Search系列 - 第四讲 支持中文

目录 一、支持中文二、自定义中文词典2.1 Redis Search设置FRISOINI参数2.2 friso.ini文件相关配置1&#xff09;自定义friso UTF-8字典2&#xff09;修改friso.ini配置文件 三、实测中文分词效果 一、支持中文 Redis Stack 从版本 0.99.0 开始支持中文文档的添加和分词。中文…

MoeCTF 2024 ---Misc方向WP

安全杂项 signin 题目描述&#xff1a; xdsec的小伙伴们和参赛者来上课&#xff0c;碰巧这一天签到系统坏了&#xff0c;作为老师的你&#xff0c;要帮他们 教师代签。 特殊提醒&#xff1a;luo同学今天好像在宿舍打游戏&#xff0c;不想来上课&#xff0c;这是严重的缺勤行为…

PoissonRecon学习笔记

1. Screened Poisson Reconstruction (SPR) 源码&#xff1a;https://github.com/mkazhdan/PoissonRecon However, as noted by several researchers, it suffers from a tendency to over-smooth the data. 泊松重建存在过度平滑的现象。 方法&#xff1a;position and gradi…

【QT】QChart绘制曲线与散点图

功能描述:绘制曲线和散点图,添加图例信息,可以进行缩放、移动,鼠标在曲线上时显示当前坐标点 QChart功能类 继承QGraphicsView 重写鼠标事件函数 protected:void resizeEvent(QResizeEvent *event);void mouseMoveEvent(QMouseEvent *event);void mousePressEvent(QMouseEv…

C++共同体

共同体是一种数据格式&#xff0c;他能储存不同的数据类型&#xff0c;但是同一时间只能储存其中的一种类型。 语法&#xff1a; union 共同体名 { 成员一的数据类型 成员名一&#xff1b; 成员二的数据类型 成员名二&#xff1b; 成员n的数据类型 成员名n&#xff1b; }

PHP养老院管理系统-计算机设计毕业源码-00115

摘要 随着社会老龄化进程的加速&#xff0c;养老院管理系统在提高养老服务质量和效率方面发挥着越来越重要的作用。本研究旨在设计和实现一个基于PHP的养老院管理系统&#xff0c;以满足养老院的日常管理需求&#xff0c;提升养老服务水平。 本研究首先对养老院管理系统的需求进…

大模型系列——幻觉

在kimi中输入提示词&#xff0c;得到本文脉络&#xff1a; 我想写大模型幻觉技术文章&#xff0c;请对以下标题进行补全和细化&#xff1a; 1、幻觉原因 2、幻觉消除方案 3、幻觉检测方案 4、幻觉评估数据集 背景 研究人员将大模型的幻觉分为事实性幻觉&#xff08;Factuali…

【状态机DP】力扣2786. 访问数组中的位置使分数最大

给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。 你 一开始 在数组的位置 0 处&#xff0c;你可以按照下述规则访问数组中的其他位置&#xff1a; 如果你当前在位置 i &#xff0c;那么你可以移动到满足 i < j 的 任意 位置 j 。 对于你访问的位置 i &#xff0c…

系统架构图设计(轻量级架构)

轻量级架构一般包括&#xff1a;表现层、业务逻辑层、持久层、数据库层 表现层架构 MVC 模型&#xff08;Model&#xff09;&#xff1a;应用程序的主体部分&#xff0c;表示业务数据和业务逻辑视图&#xff08;View&#xff09;&#xff1a;用户看到并与之交流的界面控制器&…

Windows 11优化利器:全方位定制你的操作系统

最近&#xff0c;有用户询问如何禁用Windows Defender&#xff0c;这让我想起了一款功能强大的Windows 11设置工具。这款工具不仅包含了禁用Defender的功能&#xff0c;还提供了许多其他实用的系统定制选项。 工具概览 这款名为“Windows11轻松设置”的软件&#xff0c;最近进…

延迟队列实现及其原理详解

1.绪论 本文主要讲解常见的几种延迟队列的实现方式&#xff0c;以及其原理。 2.延迟队列的使用场景 延迟队列主要用于解决每个被调度的任务开始执行的时间不一致的场景&#xff0c;主要包含如下场景: 1.比如订单超过15分钟后&#xff0c;关闭未关闭的订单。 2.比如用户可以…

保姆级教程来喽!从下载开始的Luatools~小白必看!

对于刚接触Luatools的新手朋友们&#xff0c;这篇保姆级教程将手把手教你如何从下载开始使用这款强大的调试工具。Luatools适用于合宙的多种4G模组&#xff0c;支持固件获取、打包、调试等多项功能&#xff0c;确保你的开发工作事半功倍。 本文就来讲解一下Luatools的下载和使…

Flask集成sqlalchemy (学习笔记)

文章目录 前言一、安装sqlalchemy二、连接mysql1.创建一个配置数据库信息的文件&#xff08;如上图&#xff09;2.创建sqlalchemy配置文件3.app.py中引入注册4.创建模型对象5.在app.py中进行关联6.执行映射语句&#xff08;迁移命令&#xff09; 总结 前言 本文章讲解的是分模…

Html/Vue浏览器下载并重命名文件

Html/Vue浏览器下载并重命名文件 row是上方图片的数据对象 download(row) {const link document.createElement(a);link.style.display none;// 设置下载地址link.setAttribute(href, row.url);// 设置文件名(这里可以重新设置名字&#xff0c;下载之后的文件就是你重新命名…

王源携手匡威,官宣全球代言人身份,引全网热议

近日&#xff0c;匡威隆重宣布&#xff0c;青年偶像王源荣膺其全球品牌代言人。在官宣消息发布前夕&#xff0c;王源与匡威的合作便已在微博热搜上占据头榜&#xff0c;备受广大网友关注。 随着官宣及产品上线的钟声敲响&#xff0c;王源的粉丝们迅速行动起来&#xff0c;积极支…

Linux运维篇-ansible的使用

目录 ansible简介ansible架构1、连接插件2、核心模块3、自定义模块4、插件5、剧本6、主机清单 ansible的执行过程安装Ansibleansible的使用ansible.cfg文件修改添加主机清单方式一方式二方式三 测试主机清单连接 ansible简介 简单来说&#xff0c;ansible就是一个自动化运维工…

数学物理方法第五版梁昆淼课后答案详解PDF电子版

序言 梁昆淼《数学物理方法》第四版面世以来&#xff0c;随着学科的发展&#xff0c; 物理类各专业“数学物理方法”课程的教学要求与学时发生了变化。为了适应物理类人才培养的需要&#xff0c;在第四版的基础上&#xff0c; 根据多年的教学实践&#xff0c; 对本书进行了修订…

K8S部署

二进制搭建Kubernetes v1.20 k8s集群master01&#xff1a;192.168.10.80 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xff1a;192.168.10.20 k8s集群node01&#xff1a;192.168.10.18 kubelet kube-proxy docker k8s集群node02…

数据导入导出

1.数据加载 - LOAD 语法 LOAD DATA [LOCAL] INPATH filepath [OVERWRITE] INTO TABLE tablename; 操作: 建表 CREATE TABLE myhive.test_load( dt string comment 时间&#xff08;时分秒&#xff09; , user_id string comment 用户 ID, word string comment 搜索词 , u…