38. UE5 RPG 修改火球术的攻击方向以及按住Shift攻击

news2024/11/19 3:22:40

在前面,我们实现了火球术火球的制作,能够在释放火球术时,角色将播放释放技能动画,并实现了对火球的目标的服务器同步功能。

我们先回忆一下之前完成的内容。
在前面,我们先做了一个Actor,用于承载发射的火球,名称为:Projectile,里面包含碰撞体和子弹移动组件,后面可以用于碰撞检测和子弹移动的支持。
我们又创建了基于技能的专门用于发射类似于火球这种发射物的技能类,命名为:ProjectileSpell,它在后续会专门用于发射技能。在技能里面,制作了一个生成发射物体的函数SpawnProjectile(),它内部主要实现为生成需要发射的物体,并设置变量,可以设置一个类,它会根据类生成对应的物体,比如你需要角色技能发射一个火球,那么设置火球的类即可。
然后我们使用技能内置的蒙太奇播放,然后使用动画通知通知角色接收GameplayTag标签触发对应的通知,在接收到需要发射火球的通知消息时,去执行SpawnProjectile()函数。
在这里插入图片描述
在同步这里,我们创建了一个Ability Task类,专门用于将客户端鼠标拾取的位置上传到服务器端,用于同步。在内部实现使用到了预测窗口来标注需要预测的范围,并使用TargetData将目标位置上传到了服务器。

接下来,我们将实现角色在释放技能时,修改火球的移动方向,并处理角色遮挡相机的bug,然后增加一个不需要选中敌人就可以攻击的方式。

修改火球的转向

ProjectileSpell技能类里,我们在生成火球时,在里面传递一个位置,用于修改火球的发射方向,我们之前的方法是获取角色朝向,然后根据角色的朝向
在SpawnProjectile函数增加一个传入参数,用于确定攻击目标位置

	UFUNCTION(BlueprintCallable, Category="Projectile")
	void SpawnProjectile(const FVector& ProjectileTargetLocation);

在函数实现这里,首先获取目标位置和角色位置的朝向,然后转为旋转方向,并设置Pitch(水平旋转)为0,转换为四元数设置给火球。

const FVector SocketLocation = CombatInterface->GetCombatSocketLocation();
FRotator Rotation = (ProjectileTargetLocation - SocketLocation).Rotation(); //将方向转为旋转
Rotation.Pitch = 0.f; //设置Pitch为0,转向的朝向将平行于地面

FTransform SpawnTransform;
SpawnTransform.SetLocation(CombatInterface->GetCombatSocketLocation());
SpawnTransform.SetRotation(Rotation.Quaternion());

编译打开UE,将鼠标拾取的位置存储为变量,方便后面使用
在这里插入图片描述
在触发事件创建发射物时,将位置传入
在这里插入图片描述
这样就可以测试了,火球的方向正确。
在这里插入图片描述
完整蓝图
在这里插入图片描述
现在还有个问题,就是在客户端上面点击时,火球无法出现,这是因为创建火球和结束技能时同时创建的,导致被吃掉了,现在测试,我们先不执行EndAbility节点,这样,起码能有一个完整显示的技能。
在这里插入图片描述

解决角色遮挡相机的问题

要解决这个问题,首先查找谁会遮挡相机,我们需要在节点的碰撞预设查找。
首先角色的碰撞体,会出现这个问题
在这里插入图片描述
在角色的模型上面,也有相同的问题
在这里插入图片描述
我们需要将它们与相机的碰撞设置为忽略,它们将不再检测与相机的碰撞。
我们在角色的基类这里,一劳永逸的解决这个问题,在构造函数这里,使用通过设置碰撞,通道选择相机,碰撞设置为忽略

	//设置角色不会和相机碰撞
	GetCapsuleComponent()->SetCollisionResponseToChannel(ECC_Camera, ECR_Ignore);
	GetMesh()->SetCollisionResponseToChannel(ECC_Camera, ECR_Ignore);

修改通过点击地面即可释放技能

为了防止移动和攻击冲突,接下来,我们将修改鼠标左键的操作,默认点击是移动,按住Shift键+鼠标左键则为攻击当前地点。
首先实现Shift按键事件,增加一个InputAction
在这里插入图片描述
值类型修改为一维浮点类型,Shift键只需要一维即可,记录它按下和抬起
在这里插入图片描述
将其添加到输入映射上下文中,我们需要将左右两个Shift键都添加进去
在这里插入图片描述
这个添加完了,我们需要实现对应的操作,打开PlayerController,添加一个属性,用于设置ShiftAction

	UPROPERTY(EditAnywhere, Category="Input")
	TObjectPtr<UInputAction> ShiftAction;

接下来,我们创建绑定ShiftAction的回调函数,按下和抬起,并添加一个变量用于标示当前状态释放处于按下状态

	void ShiftPressed() { bShiftKeyDown = true; };
	void ShiftReleased() { bShiftKeyDown = false; };
	bool bShiftKeyDown = false;

绑定对应的输入事件回调

void APlayerControllerBase::SetupInputComponent()
{
	Super::SetupInputComponent();

	UInputComponentBase* EnhancedInputComponent = CastChecked<UInputComponentBase>(InputComponent); //获取到增强输入组件

	EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &APlayerControllerBase::Move); //绑定移动事件

	//绑定Shift按键事件
	EnhancedInputComponent->BindAction(ShiftAction, ETriggerEvent::Started, this, &ThisClass::ShiftPressed);
	EnhancedInputComponent->BindAction(ShiftAction, ETriggerEvent::Completed, this, &ThisClass::ShiftReleased);

	EnhancedInputComponent->BindAbilityAction(InputConfig, this, &ThisClass::AbilityInputTagPressed,&ThisClass::AbilityInputTagReleased, &ThisClass::AbilityInputTagHold);
}

我们需要在Hold事件和Released事件回调中修改判断,之前只是判断如果当前选中了攻击目标,则释放技能,现在则需要加上是否按住了Shift键
在这里插入图片描述
接着编译打开PlayerController的蓝图,设置上Shift键位的Action,运行测试,按住Shift键后触发技能。
在这里插入图片描述

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

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

相关文章

《九》Qt各种对话框之QColorDialog

前言 QColorDialog类继承于QDialog&#xff0c;是一个设计用来选择颜色的对话框部件。 QColorDialog 在介绍 QColorDialog 之前&#xff0c;我们先简单介绍一下 QColor 类。QColor 类用于表示颜色&#xff0c;支持 RGB&#xff08;红绿蓝&#xff09;三原色表示&#xff0c;也…

使用Web3Modal2.0轻松集成多链钱包连接

随着区块链技术的快速发展&#xff0c;多链互操作性成为了一个重要的趋势。Web3Modal 2.0 作为一款强大的JavaScript库&#xff0c;为开发者提供了更加灵活和便捷的多链钱包集成解决方案。以下内容将介绍Web3Modal 2.0 的新特性&#xff0c;并详细讲解如何使用它来构建一个支持…

如何打造个性化支付宝小程序

支付宝小程序已成为企业与个人展示自身特色、连接用户的重要桥梁。想要快速拥有一个属于自己的支付宝小程序吗&#xff1f;别担心&#xff0c;今天就来分享一个简单又实用的方法——通过套用模板来轻松制作你的支付宝小程序。 选择一个靠谱的小程序模板开发平台是关键。国内主流…

yolov8 区域多类别计数

yolov8 区域多类别计数 1. 基础2. 计数功能2.1 计数模块2.2 判断模块 3. 初始代码4. 实验结果5. 完整代码6. 源码 1. 基础 本项目是在 WindowsYOLOV8环境配置 的基础上实现的&#xff0c;测距原理可见上边文章 2. 计数功能 2.1 计数模块 在指定区域内计数模块 region_point…

算法课程笔记——STL键值对map

map当下标无限的数组 重点是对应关系&#xff0c;一般不修改compare 类比set 没有lowerbound&#xff0c;因为遍历是无序的 ; map不能用sort函数排序 但可用vector转化为map使用 std::set<std::pair<TKEY, mutable TVAL> > ≈ std::map<TKEY, TVAL>

Java基础入门1-2

跟着韩顺平老师的30天入门java课程学习&#xff0c;整理一下自己的笔记&#xff0c;方便回顾知识点和复习。 另附上视频链接&#xff1a;0034_韩顺平Java_变量原理_哔哩哔哩_bilibili 第一章&#xff1a;学习前的了解 第二章&#xff1a;Java概述 2.1什么是程序&#xff1f…

C++ STL标准库,rotate函数详解

rotate翻译 rotate v.&#xff08;使&#xff09;旋转&#xff0c;&#xff08;使&#xff09;转动&#xff1b;&#xff08;人员&#xff09;轮换&#xff0c;轮值&#xff1b;轮种&#xff0c;轮作&#xff1b;定期调换地点&#xff08;或位置&#xff09;adj.&#xff08;…

【WSL】单机大模型前的基础环境配置

前言&#xff1a;在上一篇文章中&#xff0c;我们完成了WSL的部署&#xff0c;但是在大模型搭建&#xff08;尤其是Langchain&#xff09;前&#xff0c;还碰到了不少的坑&#xff0c;查找了不少的文章&#xff0c;所以本篇文章就做一个记录&#xff0c;避免以后再走冤枉路。 …

python学习笔记(集合)

知识点思维导图 # 直接使用{}进行创建 s{10,20,30,40} print(s)# 使用内置函数set()创建 sset() print(s)# 创建一个空的{}默认是字典类型 s{} print(s,type(s))sset(helloworld) print(s) sset([10,20,30]) print(s) s1set(range(1,10)) print(s1)print(max:,max(s1)) print(m…

入门指南:网站UI原型设计的简单方法

从零开始做网站UI原型设计&#xff0c;真的很有成就感&#xff01;那么&#xff0c;UI设计师从零开始做网站UI原型设计需要经历哪些过程呢&#xff1f;设计网站UI原型的第一步&#xff1a;绘制网站线框。本文将主要分为两个阶段&#xff1a;网站线框和原型绘制。 如何制作网站…

HDFS详解(Hadoop)

Hadoop 分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;HDFS&#xff09;是 Apache Hadoop 生态系统的核心组件之一&#xff0c;它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储&#xff1a; HDFS 将文件分割成若干块…

SAP Fiori开发中的JavaScript基础知识15 - 原型,object,constructor,class,继承

1. 前言 本文将介绍JavaScript中的核心概念 - 原型&#xff0c;并会介绍基于原型的应用场景object&#xff0c;constructor&#xff0c;class&#xff0c;继承。 本文会将这几个核心概念汇总在一篇博客中&#xff0c;因为这些概念是触类旁通的&#xff0c;希望对你有帮助。 …

【linux】编译器使用

目录 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&#xff09; 2. .o 文件和库的链接方式 a. 链接方式 b. 动态库 和 静态库 优缺点对比 c. debug 版本 和 release 版本 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&…

CCF区块链会议--Middleware 2024 截止5.24 附录用率

会议名称&#xff1a;Middleware CCF等级&#xff1a;CCF B类会议 类别&#xff1a;软件工程/系统软件/程序设计语言 录用率&#xff1a;2022年录用率38%&#xff08;8/21&#xff09; Topics of Interest The Middleware conference seeks original submissions of resear…

销冠必备:高效跟进客户的四个技巧

作为一名销售&#xff0c;高效而精准地跟进客户是取得成功的关键。今天&#xff0c;我将分享四个技巧&#xff0c;让你也能够高效的跟进客户。 1、善于发问 通过多询问客户&#xff0c;你可以更好地了解客户的需求和痛点。在与客户交流时&#xff0c;不要只是简单地回答问题&…

SpringCloud基础 Consul的引入

前言 首先是为什么引入consul这个组件 我们知道微服务分为很多个模块,这里模块中相互调用,我使用硬编码的模式是不好的 比如微服务模块需要更新的时候,我们使用硬编码的方式可能需要修改很多个地方 但是使用consul之后,就引入了注册中心,我们只需要将对应的服务注册为节点 这样…

如何修复U盘在Windows 10上断开又重新连接的问题?这里有方法

序言 有时,当你把U盘连接到电脑上时,U盘每隔几秒钟就会断开连接并重新连接,这导致你无法正常复制和传输文件,这真的很烦人。硬件或驱动程序可能有问题。 在这种情况下,你需要确保此U盘与其他计算机是否正常工作。如果是,则表示你的驱动器没有问题。如果不是,不要担心。…

我们该如何看待AIGC(人工智能)

目录 AIGC的概述&#xff1a; AIGC的发展经历&#xff1a; AIGC的概述&#xff1a; [TOC]( &#x1f680;文章目录) ---AIGC全称为AI-Generated Content&#xff0c;指基于生成对抗网络GAN、大型预训练模型等人工智能技术&#xff0c;通过已有数据寻找规律&#xff0c;并通过…

服务网关GateWay基础

1. 网关基础介绍1.1 网关是什么1.2 为啥要用网关1.3 常见的网关组件NginxNetflix ZuulSpring Cloud GatewayKongAPISIX综合比较 2. gateWay的使用2.1 springCloud整合gateway2.2 GateWay的相关用法2.3 GateWay路由使用示例基本用法转发/重定向负载请求动态路由 2.5 断言(Predic…