35. UE5 RPG制作火球术技能

接下来,我们将制作技能了,总算迈进了一大步。首先回顾一下之前是如何实现技能触发的,然后再进入正题。
如果想实现我之前的触发方式的,请看此栏目的31-33篇文章,讲解了实现逻辑,这里总结一下:

  1. 首先创建一个DataAsset用于存储InputAction和GameplayTag对应的数据
  2. 在触发InputAction的时候,将GameplayTag作为参数去调用输入回调
  3. 在技能身上绑定对应的GameplayTag,在回调中遍历角色身上的应用的技能,如果Tag相同,则激活技能。

现在技能可以被激活了,需要我们实现技能内的逻辑,接下来,我们将从简单的开始实现,那就是火球术。
要创建技能的完整内容我们需要:

  • 创建一个Actor,在里面增加一个碰撞体和一个发射器,用于实现子弹移动和碰撞检测。
  • 创建一个基于技能基类的用于发射火球的技能,通过里面逻辑进行动画播放和火球发射。

创建Projectile类

首先创建一个Projectile类,继承Actor,可以放置到场景中。并在内部实现碰撞检测和发射器组件。
在这里插入图片描述

打开以后,将里面的Tick函数删除,我们不需要每帧更新

public:	// Called every framevirtual void Tick(float DeltaTime) override;

将其每帧更新设置为false

PrimaryActorTick.bCanEverTick = false;

并且,将此类设置为在服务器运行

bReplicates = true; //此类在服务器运行,然后复制到每个客户端

首先,我们添加一个碰撞体,这里添加了一个球型碰撞体

private:UPROPERTY(VisibleAnywhere)TObjectPtr<USphereComponent> Sphere;

在构造函数中,对碰撞体进行初始化

	//初始化碰撞体Sphere = CreateDefaultSubobject<USphereComponent>("Sphere");SetRootComponent(Sphere); //设置其为根节点,Sphere->SetCollisionEnabled(ECollisionEnabled::QueryOnly); //设置其只用作查询使用Sphere->SetCollisionResponseToChannels(ECR_Ignore); //设置其忽略所有碰撞检测Sphere->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Overlap); //设置其与世界动态物体产生重叠事件Sphere->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); //设置其与世界静态物体产生重叠事件Sphere->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); //设置其与Pawn类型物体产生重叠事件

接着增加对应的碰撞检测回调,这个回调函数内部实现我们将在后续实现

	void OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);

然后再BeginPlay回调用,触发重叠时,绑定此回调

Sphere->OnComponentBeginOverlap.AddDynamic(this, &AProjectile::OnSphereOverlap);

接着,我们创建一个发射组件,发射组件通常用于控制投射物的移动,例如子弹或火箭。这个组件通常负责处理投射物的速度、加速度、路径等。

public:	UPROPERTY(VisibleAnywhere)TObjectPtr<UProjectileMovementComponent> ProjectileMovement;

在构造函数中对其进行初始化

	//创建发射组件ProjectileMovement = CreateDefaultSubobject<UProjectileMovementComponent>("ProjectileMovement");ProjectileMovement->InitialSpeed = 550.f; //设置初始速度ProjectileMovement->MaxSpeed = 550.f; //设置最大速度ProjectileMovement->ProjectileGravityScale = 0.f; //设置重力影响因子,0为不受影响

接下来,编译打开UE,我们创建一个对应的蓝图
在这里插入图片描述
打开以后,如果左侧有我们创建的对应的组件
在这里插入图片描述
碰撞体的碰撞类型,也是按我们的设置来的
在这里插入图片描述
在根节点(碰撞体)下面添加一个Niagara组件,用于播放粒子特效
在这里插入图片描述
添加上对应的Nigara粒子特效,可以放置到场景中查看效果
在这里插入图片描述

创建ProjectileSpell

ProjectileSpell是基于技能类创建的子类,我们可以查看源码对基类增加更多的了解,这里我对基类的h文件进行的翻译:
UE5 GameplayAbility 源码定义解析
炮弹创建好了,但是它没有发射器,所以我们接下来实现一下火球的发射器,在里面实现角色发射动画,以及可以在内部实现对火球的发射位置和发射朝向的设置。
首先基于之前创建的技能基类创建一个子类,命名为ProjectileSpell,我们将其作为这种炮弹类的技能的特定类型的技能类
在这里插入图片描述
在函数内部,我们首先添加了一个保护函数,覆盖父类的ActivateAbility,这是一个回调函数,在技能激活时,会触发此回调
回调中会返回四个参数,技能实例句柄(可以用此获取实例),激活角色的相关信息,技能激活的相关信息(手动激活还是自动激活,按键激活),激活事件以及传递的数据。

protected:virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;

我们在实现这里先打印一条Log用于测试运行顺序,接着在蓝图中也会打印。

void UProjectileSpell::ActivateAbility(const FGameplayAbilitySpecHandle Handle,const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,const FGameplayEventData* TriggerEventData)
{Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);UKismetSystemLibrary::PrintString(this, FString("在c++中打印数据"), true, true, FLinearColor::Blue, 3);
}

接着编译项目,创建一个基于ProjectileSpell的技能蓝图
在这里插入图片描述
在技能蓝图中,设置鼠标左键触发
在这里插入图片描述
在触发技能激活回调中,触发打印
在这里插入图片描述
需要在角色创建的时候将技能蓝图应用,所以,我们在角色蓝图中属性中设置技能应用。
在这里插入图片描述
运行,点击敌人,发现打印,看来在c++中输入汉字不支持,顺序就是先调用了蓝图,然后又调用的c++内的回调。
在这里插入图片描述
接下来,我们实现使用技能发射火球,首先在类里增加一个属性来设置火球的类,在技能激活时去实例化

	UPROPERTY(EditAnywhere, BlueprintReadOnly)TSubclassOf<AProjectile> ProjectileClass;

我们还需要一个位置去发射火球,这个位置我们选择武器上面的一个骨骼节点作为位置。在之前的战斗接口类里面增加一个获取骨骼插槽位置的函数,这个函数需要在子类去覆盖

	virtual FVector GetCombatSocketLocation();

然后再角色基类中,添加一个设置骨骼节点名称的变量,并覆盖这个函数

	UPROPERTY(EditAnywhere, Category = "Combat")FName WeaponTipSocketName;virtual FVector GetCombatSocketLocation() override;

函数实现,直接调用获取骨骼接口名称的位置

FVector ACharacterBase::GetCombatSocketLocation()
{return Weapon->GetSocketLocation(WeaponTipSocketName);
}

有了火球术的类,有了发射的位置,我们就可以生成火球了,接着回到ProjectileSpell里面,首先将控制的Actor转换为战斗接口

if (ICombatInterface* CombatInterface = Cast<ICombatInterface>(GetAvatarActorFromActorInfo()))

如果转换成功,那么我们就可以通过接口函数去获取位置信息,创建一个变换变量

		FTransform SpawnTransform;SpawnTransform.SetLocation(CombatInterface->GetCombatSocketLocation());SpawnTransform.SetRotation(GetAvatarActorFromActorInfo()->GetActorQuat());

现在,我们火球类有了,位置变换有了,最后,使用通用方法生成火球,

		//SpawnActorDeferred将异步创建实例,在实例创建完成时,相应的数据已经应用到了实例身上GetWorld()->SpawnActorDeferred<AProjectile>(ProjectileClass,SpawnTransform,GetOwningActorFromActorInfo(),Cast<APawn>(GetOwningActorFromActorInfo()),ESpawnActorCollisionHandlingMethod::AlwaysSpawn);

如果你是异步生成的Actor,还需要调用FinishSpawning函数确保设置正确的应用到actor上面。

//确保变换设置被正确应用
Projectile->FinishSpawning(SpawnTransform);

首先在技能上面设置需要生成的火球术的类
在这里插入图片描述

设置完成以后,我们需要设置使用的插槽 ,也可以在武器骨骼上面创建插槽使用。
在这里插入图片描述
案例里面武器顶部有个TipSocket插槽,我们将使用此位置发射火球。
在这里插入图片描述
记得在角色设置里面设置对应骨骼插槽名称。
在这里插入图片描述
到现在,我们实现了一个最基础的火球术,接着运行项目查看效果。
在这里插入图片描述
在技能里,我使用了蒙太奇播放角色动画,在蒙太奇播放完成结束当前技能,如果技能结束还可以再次触发。
在这里插入图片描述
现在,我们实现了一个最简单的通过火球术技能,效果很差,接下来,我们将接着实现火球术,并让效果看起来更合理,并在后面实现对敌人造成伤害。

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

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

相关文章

【云计算】云数据中心网络(六):私网连接

云数据中心网络&#xff08;六&#xff09;&#xff1a;私网连接 1.什么是私网连接2.私网连接的组成3.私网连接的优势4.私网连接的主要应用场景 前面讲到 VPC 网络具有隔离性&#xff0c;VPC 之间无法通信。当一个 VPC 中的终端需要访问部署在另一个 VPC 中的服务时&#xff0c…

【C++题解】1345. 玫瑰花圃

问题&#xff1a;1345. 玫瑰花圃 类型&#xff1a;基本运算、小数运算 题目描述&#xff1a; 有一块nn&#xff08;n≥5&#xff0c;且 n 是奇数&#xff09;的红玫瑰花圃&#xff0c;由 nn 个小正方形花圃组成&#xff0c;现要求在花圃中最中间的一行、最中间的一列以及 4 个…

如何学习VBA_3.2.19:利用Shell函数运行可执行程序

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。 如果…

Python学习教程(Python学习路线+Python学习视频):Python数据结构

数据结构引言&#xff1a; 数据结构是组织数据的方式&#xff0c;以便能够更好的存储和获取数据。数据结构定义数据之间的关系和对这些数据的操作方式。数据结构屏蔽了数据存储和操作的细节&#xff0c;让程序员能更好的处理业务逻辑&#xff0c;同时拥有快速的数据存储和获取方…

QAnything部署Mac m1环境

本次安装时Qanything已经更新到了v1.3.3&#xff0c;支持纯python安装。安装过程比较简单&#xff0c;如下&#xff1a; QAnything/README_zh.md at qanything-python-v1.3.1 netease-youdao/QAnything GitHub 首先需要用Anaconda3创建隔离环境&#xff0c;简要说明下Anaco…

【机器学习300问】72、神经网络的隐藏层数量和各层神经元节点数如何影响模型的表现?

评估深度学习的模型的性能依旧可以用偏差和方差来衡量。它们反映了模型在预测过程中与理想情况的偏离程度&#xff0c;以及模型对数据扰动的敏感性。我们简单回顾一下什么是模型的偏差和方差&#xff1f; 一、深度学习模型的偏差和方差 偏差&#xff1a;衡量模型预测结果的期望…

60道计算机二级模拟试题选择题(含答案和解析)

点击下载《60道计算机二级模拟试题选择题&#xff08;含答案和解析&#xff09;》 1. 前言 本文设计了一份针对计算机二级考试的选择题&#xff0c;旨在考察考生对计算机基础知识和应用技能的掌握情况。试题涵盖了计算机基础知识、操作系统、办公软件、计算机网络等多个方面&…

无风扇嵌入式车载电脑在矿山车辆行业应用

矿山车辆行业应用 背景介绍 现代的采矿业面临许多的挑战&#xff0c;其中最重要的就是安全性的问题&#xff0c;无论在矿井下或地面上的工作&#xff0c;都必须确保员工的安全保障。因此&#xff0c;先进的矿车必须整合专用的车载电脑&#xff0c;在极其恶劣的采矿环境中稳定运…

通过excel获取网站的数据信息

通过excel获取网站的数据信息&#xff0c;有时候网站数据的表格很多数据&#xff0c;需要梳理到表格中&#xff0c;如何用excel表格直接读取网站数据 备注问题&#xff1a;表格内容有时候在一行&#xff0c;很长&#xff0c;不方便处理 bug问题&#xff1a;不要多选&#xff0…

问题:react函数中的state是上一次的值

场景 有一个聊天输入框组件&#xff0c;输入框上面有表情包组件。 通过redux创建了store&#xff0c;存储一个message的状态&#xff0c;用于表情包和输入框共享状态。 输入框通过设置value和onClick做了一个简单双向绑定&#xff0c;其中value的值为store里的message。 impor…

亚信安全数据安全运营平台DSOP新版本发布 注入AI研判升维

在当今快速发展的数字经济时代&#xff0c;企业对于数据的依赖日益加深&#xff0c;数据安全已成为企业的生命线。亚信安全推出数据安全运营平台DSOP全新版本&#xff0c;正是为满足企业对数据安全的高度需求而设计。这款平台以其卓越的能力和技术优势&#xff0c;为企业的数据…

目标检测——行人交通信号灯数据集

一、重要性及意义 行人交通信号灯检测的重要性及意义主要体现在以下几个方面&#xff1a; 首先&#xff0c;行人交通信号灯检测对于提高道路安全性至关重要。通过准确识别交通信号灯的状态&#xff0c;行人可以更加清晰地了解何时可以安全地过马路&#xff0c;从而避免与车辆…

MFC下CPictureCtrl控件基于鼠标左键坐标的直线绘图

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 目录 1.创建自定义类CMyPictureCtrl 2.布局Dlg 3.实验代码 4.运行结果 在基于对话框的MFC应用程序中&#xff0c;通过鼠标操作获取坐标并在CPictureCtrl控件中使用Lin…

ArcGIS无法链接在线地图或错误: 代理服务器从远程服务器收到了错误地址(验证服务器是否正在运行)。

这几天我们分享了&#xff01; 谷歌卫星影像图归来&#xff01;ArcGIS直连&#xff01;快来获取_谷歌影像lyr-CSDN博客文章浏览阅读666次&#xff0c;点赞11次&#xff0c;收藏9次。大概。_谷歌影像lyrhttps://blog.csdn.net/kinghxj/article/details/137521877一套图源搞定&a…

【绘图软件】solidworks2022版本安装强制卸载(清理干净版!)全流程~超详细+报错避坑

安装包可以去【盒子部落】下载&#xff0c;也可以用下面网盘直接下载&#xff1a; 夸克网盘链接&#xff1a;https://pan.quark.cn/s/f2c110617bfa&#xff08;无密码&#xff09; 1.解压后进入文件夹 2.进入_SolidSQUAD_文件夹 3.复制SolidWorks_Flexnet_Server文件夹 4.打开C…

创建一个javascript公共方法的npm包,js-tool-big-box,发布到npm上,一劳永逸

前端javascript的公共方法太多了&#xff0c;时间日期的&#xff0c;数值的&#xff0c;字符串的&#xff0c;搞复制的&#xff0c;搞网络请求的&#xff0c;搞数据转换的&#xff0c;几乎就是每个新项目&#xff0c;有的拷一拷&#xff0c;没有的继续写&#xff0c;放个utils目…

简述PDF原理和实践

Hello&#xff0c;我是小恒不会java。 由于最近有输出PDF报表的项目需求&#xff0c;所以复习一下PDF到底是什么&#xff0c;该如何产生&#xff0c;如何应用至项目中。 更多参见Adobe官方文档&#xff08;https://www.adobe.com/cn/&#xff09; PDF原理 PDF&#xff08;Port…

Flask如何在后端实时处理视频帧在前端展示

怎么样在前端->选择视频文件->点击上传视频后->后端实时分析上传的视频->在前端展示后端分析结果&#xff08;视频&#xff0c;文本&#xff09; ↓ 咱们先看整看整体代码&#xff0c;有个大概的印象。 Flask后端代码 cljc车流检测Demofrom pytz import timezon…

Java PDF文件流传输过程中速度很慢,如何解决?

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

MT3026 砍玉米

样例1&#xff1a; 输入&#xff1a; 6 1 3 4 2 5 1 7 8 19 10 30 2 输出&#xff1a; 6 其中1<n<10^5,1<xi,hi<10^9 思路&#xff1a;贪心&#xff1a;从左到右或者从右到左依次判断每一棵玉米是否可以倒下 &#xff08;以从左到右为例&#xff1a;先往左倒&…