35. UE5 RPG制作火球术技能

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

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

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

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

创建Projectile类

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

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

public:	
	// Called every frame
	virtual 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);

到现在,我们实现了一个最基础的火球术,接着运行项目查看效果。
在这里插入图片描述
在技能里,我使用了蒙太奇播放角色动画,在蒙太奇播放完成结束当前技能,如果技能结束还可以再次触发。
在这里插入图片描述
现在,我们实现了一个最简单的通过火球术技能,效果很差,接下来,我们将接着实现火球术,并让效果看起来更合理,并在后面实现对敌人造成伤害。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一个实例了解JVM运行原理

下面以一个具体的代码示例&#xff0c;来说明Java代码对象是如何分配的&#xff0c;Java代码又是如何在JVM中运行的。 public class JVMCase {// 常量public final static String MAN_SEX_TYPE "man";// 静态变量public static String WOMAN_SEX_TYPE "woman…

MGRE环境下的OSPF配置

拓扑图 R1配置 [r1]int Tunnel 0/0/0 [r1-Tunnel0/0/0]ip add 192.168.7.1 24 [r1-Tunnel0/0/0]tunnel-protocol gre p2mp [r1-Tunnel0/0/0]source 16.0.0.1 [r1-Tunnel0/0/0]nhrp network-id 100[r1]int t0/0/1 [r1-Tunnel0/0/1]ip add 192.168.8.1 24 [r1-Tunnel0/0/1]tunn…

远程抄表系统与配电能效系统在大学学生公寓的应用/远程抄表计费系统

安科瑞薛瑶瑶18701709087 摘要&#xff1a;该校及全国各大高校学生公寓目前收费模式及现状&#xff0c;远程抄表智能系统的必要性及系统运行状况的对比。 关键词&#xff1a;远程抄表智能系统&#xff1b;必要性&#xff1b;优点 0、前言 该校在远程抄表智能系统使用前学生…

文字转语音TTS在线使用经验

文字转语音TTS在线使用经验 文字转语音TTS在线使用经验 2024-04-15 &#xff0c;今天测试了一下微软 Azure TTS 的新语音引擎&#xff0c;主要测试了英语和中文。 这次 MicroSoft 一共推出了 9 款包括&#xff1a; 美式英语 - en-US-AvaMultilingualNeural 女性 美式英语 - en…

【Java基础学习】面向对象编程

开始时间: April 10, 2024 结束时间: April 16, 2024 阶段: Done 基础部分 类与对象的关系 类是抽象的&#xff0c;概念的&#xff0c;代表一类事物对象是具体的&#xff0c;实际的&#xff0c;代表一个具体事物&#xff08;实例&#xff09;类是对象的模板&#xff0c;对象…

基于Springboot+Vue的Java项目-校园管理系统(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

mysql,oracle,sql server中的默认事务隔离级别查看

一 、事务 一个事务中的一系列的处理操作要么全部成功&#xff0c;要么全部失败。在数据库操作中&#xff0c;一项事务&#xff08;Transaction&#xff09;是由一条或多条操作数据库的SQL语句组成的一个不可分割的工作单元。 事务的处理结果有两种&#xff1a; 1&#xff09;当…

使用AI动作捕捉制作动画图像——Viggle AI教程

使用AI动作捕捉制作动画图像——Viggle AI教程 在数字媒体时代&#xff0c;动画制作已经成为一种流行的艺术形式。最近&#xff0c;我在网上发现了一个非常有趣的AI动画制作工具——Viggle AI。这个工具不仅简单易用&#xff0c;而且目前还是免费的。在这篇博客中&#xff0c;我…

DHCP小实验

实验要求&#xff1a; 看拓扑有两个网段则我们首先需要对200.1.1.0/26进行子网划分&#xff0c;划分为两个子网&#xff0c;为200.1.1.0/27和200.1.1.32/27 我门就可以一边一个网段了&#xff0c;左边为200.1.1.0/27&#xff0c;右边为200.1.1.32/27 1、配置PC1&#xff0c;2…

腾讯EdgeOne产品测评体验——不仅仅是加速,更是您数字安全的坚实盾牌!

EdgeOne 是什么--- 下一代CDN 腾讯云推出的边缘安全加速平台 EO&#xff08;Tencent cloud EdgeOne&#xff0c;下文简称为 EdgeOne&#xff09; 是基于腾讯边缘计算节点提供加速和安全的解决方案。即对标传统的 CDN 网络分发节点&#xff0c;但是其在加速和安全防护的方面有更…

从建表语句带你学习doris_表索引

1、doris建表概述 1.1、doris建表模板 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [DATABASE.]table_name (column_definition1[,column_deinition2,......][,index_definition1,[,index_definition2,]] ) [ENGINE [olap|mysql|broker|hive]] [key_desc] [COMMENT "tabl…

无人零售行业展望:智能化与便利性引领未来

无人零售行业展望&#xff1a;智能化与便利性引领未来 无人零售&#xff0c;这一依靠智能化技术如人工智能、物联网、和大数据的零售模式&#xff0c;正逐步成为全球零售行业的新趋势。该模式允许消费者在没有店员的情况下自助完成购物&#xff0c;提供了24小时服务&#xff0…

Redis集群机制及一个Redis架构演进实例

Replication&#xff08;主从复制&#xff09; Redis的replication机制允许slave从master那里通过网络传输拷贝到完整的数据备份&#xff0c;从而达到主从机制。为了实现主从复制&#xff0c;我们准备三个redis服务&#xff0c;依次命名为master&#xff0c;slave1&#xff0c…

季节更迭 关爱不变 | 鲁南制药四季守护您的健康生活

春天&#xff0c;万物复苏的季节&#xff0c;一切都充满了生机和活力。在春日的阳光下&#xff0c;鲜花盛开&#xff0c;绿叶茂盛&#xff0c;鸟儿欢歌&#xff0c;蝴蝶翩翩起舞。我们的身体也需要特别的关爱和养护&#xff0c;保持健康和活力&#xff0c;更好地迎接每一次季节…

MySQL 实例employee表综合查询

目录 表关系图&#xff1a; 例题&#xff1a; 1.查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数。 2.列出所有员工的姓名及其直接上级的姓名。 3.列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。 4.列出部门名称和这些部门的员工信…

正五边形C语言绘制方法

正五边形C语言绘制方法 平面几何大家都学过&#xff0c;基本的概念就是点、线、面&#xff0c;三角形、矩形、圆形和椭圆形&#xff0c;还有就是多边形。学几何时都强调用圆规直尺三角板作图&#xff0c;学到角度就用到量角尺。那时我对五角星&#xff0c;六角星很感兴趣。后来…

【攻防世界】lottery

弱比较代码审计 本题已提供源码&#xff0c;如果没提供&#xff0c;输入/robots.txt&#xff0c;发现/.git function buy($req){require_registered();require_min_money(2);$money $_SESSION[money];//接受用户原有money$numbers $req[numbers];//接受输入的数字$win_num…

生产者消费者模型之环形队列

引入 以电影院买票为例 去电影院看电影需要先买票&#xff0c;如果买过票了&#xff0c;哪怕我们没有去看电影&#xff0c;在电影票的有效期内&#xff0c;电影院对应的座位就是属于你的。 买票的本质&#xff1a;对资源&#xff08;座位&#xff09;的预订。 信号量 本质…

【VUE】Vue项目打包报告生成:让性能优化触手可及

Vue项目打包报告生成&#xff1a;让性能优化触手可及 Vue.js是一款流行的前端框架&#xff0c;开发者在使用Vue.js构建项目时&#xff0c;生产环境的性能优化尤为重要。为了帮助开发者分析和优化打包出来的资源&#xff0c;生成打包报告是一个不可或缺的步骤。本文将介绍几种在…

光纤收发器的注意事项

光纤收发器有各种不同的类别&#xff0c;而实际使用中最受关注的是根据光纤收发器的不同类别&#xff1a;SC连接器光纤收发器和FC/ST连接器光纤收发器。 当使用光纤收发器连接到不同的设备时&#xff0c;必须小心使用不同的端口。 1.光纤收发器与100Base TX设备&#xff08;交…