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

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

我们先回忆一下之前完成的内容。
在前面,我们先做了一个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.mzph.cn/web/1646.shtml

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

相关文章

集成学习-Bagging与随机森林回归

reg_fRFR() reg_tDTR()#实例化决策树 cvKFold(n_splits5,shuffleTrue,random_state1412)#实例化验证方式 result_tcross_validate(reg_t#要进行交叉验证的评估器,X,y,cvcv,scoringneg_mean_squared_error#评估指标,return_train_scoreTrue#是否返回训练分数&#xff0c;后面这几…

Git 原理及使用 (带动图演示)

文章目录 &#x1f308; Ⅰ Git 安装&#x1f319; 01. Linux - centos &#x1f308; Ⅱ Git 工作区、暂存区和版本库&#x1f319; 01. 认识工作区、暂存区和版本库&#x1f319; 02. 使用 Git 管理工作区的文件 &#x1f308; Ⅲ Git 基本操作&#x1f319; 01. 创建本地仓库…

动态Web项目讲解+Demo

web流程演示 请求路径 请求路径明确要请求的是哪个servlet 请求方式 servlet含有两种请求方式&#xff1a;doGet和doPost doGet&doPost 返回数据就是httpResponse&#xff0c;返回给success 参数 包含在request当中 成功 上述流程任何一步都没出问题&#xff0c;就会…

SpringBoot+layuimini实现左侧菜单动态展示

layuimini左侧菜单动态显示 首先我们看一下layuimini的原有菜单显示格式 {"homeInfo": {"title": "首页","href": "page/welcome-2.html?t2"},"logoInfo": {"title": "LAYUI MINI","…

cv2技术原理-图像旋转原理及手动实现

cv2技术原理-图像旋转原理及手动实现 1、图像旋转opencv实现2、cv2.getRotationMatrix2D函数解释3、数学原理推导旋转矩阵M4、手动计算旋转矩阵M5、旋转矩阵M的使用6、使用旋转矩阵M手动实现旋转功能 1、图像旋转opencv实现 图像旋转在对数据集数据增强&#xff08;主要是随机…

Java语言——封装

一.封装的定义 在面向对象程式设计方法中&#xff0c;封装&#xff08;英语&#xff1a;Encapsulation&#xff09;是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码随机访问…

linux|将用户加入白名单

一 用root用户找到etc\sudoers文件 cd etc 二 修改etc\sudoers 文件的权限 默认是只读的 修改为可写的 chmod uw sudoers 三 打开 sudoers文件&#xff0c;在Allow root to run any commands anywhere 后面 添加一条&#xff08;把上面的一条内容复制下来 修改用户名即…

什么是程控电源?以及程控电源的工作原理与应用。

一、程控电源的简介&#xff1a; 程控电源是一种具有编程功能的电源设备&#xff0c;它可以通过外部控制来设定输出电压、电流的稳压、稳流或稳压/稳流模式&#xff0c;因此可以进行电压、电流、相位、频率、功率等参数的试验和检定。一些具体的产品特性包括微机控制、高精度、…

表达式求值(后缀表达式)(数据结构)

一、概念 算术表达式是由操作数&#xff08;运算数&#xff09;、运算符&#xff08;操作符&#xff09;、和界线符&#xff08;括号&#xff09;三部分组成&#xff0c;在计算机中进行算术表达式的计算是通过堆栈来实现的。 二后缀表达式的逻辑和实现方式&#xff08;逆波兰…

电商平台数据有哪些?如何进行电商平台数据分析?(内附模板及工具)

在电商日常的贩卖工作中会产生大量的数据&#xff0c;如果你还不知道如何利用这些宝贵的数据指导未来的销售策略、增长销售额的话&#xff0c;就和我一起看下去吧&#xff01;电商数据采集API接口包含哪些数据&#xff1f; 电商平台数据可以大致分为以下几个组成部分&#xff…

Java中的封装

package day32; ​ public class Person {private String name;private int age; ​public String getName() {return name;} ​public void setName(String name) {this.name name;} ​public int getAge() {return age;} ​public void setAge(int age) {if (age>120 || …

蚓链数字化营销系统与数字资产的关系

蚓链数字化营销系统是一种利用数字技术来实现营销目标的系统。它集成了多种数字营销工具和渠道&#xff0c;以收集、分析和利用客户数据&#xff0c;优化营销活动&#xff0c;并提高营销效果。 数字资产是一种新型的资产类别&#xff0c;它们以电子数据的形式存在&#xff0c;可…

笔试狂刷--Day3

大家好,我是LvZi,今天带来笔试狂刷--Day3 一.牛牛的快递 1.题目链接:牛牛的快递 2.分析: 简单的模拟 3.代码实现: import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner i…

计算机经典黑皮书分享

计算机经典黑皮书是一套计算机科学丛书&#xff0c;其中包含了多本计算机科学领域的经典教材 提供了全面的知识体系&#xff1a;黑皮书涵盖了计算机科学的多个领域&#xff0c;如计算机组成与设计、操作系统、数据库、人工智能等。它们深入浅出地介绍了相关领域的基本概念、原…

HTTP/HTTPS详解

HTTP/HTTPS详解 1. HTTP1.1 HTTP基础知识1.2 HTTP建立和断开连接 2. HTTPS 1. HTTP 1.1 HTTP基础知识 HTTP是互联网上应用最为广泛的一种网络协议&#xff0c;是一个客户端和服务器端请求和应答的标准&#xff08;TCP&#xff09;&#xff0c;用 于从WWW服务器传输超文本到本…

C++学习————第八天(C/C++内存管理)

目录 1、1.C/C内存分布 2、 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3、C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 4.operator new与operator delete函数 5. new和delete的实现原理 5.1 内置类型 5.2 自定…

【QT学习】8.qt事件处理机制,事件过滤器,自定义事件

1.qt事件处理机制 事件处理&#xff1a; 当用户移动鼠标的时候 &#xff0c;创建一个 鼠标移动事件对象 然后把这个对象放到 事件队列里面去&#xff0c;事件管理器 从队列中 取出事件&#xff0c;然后 调用其对应的事件处理函数。 多态机制&#xff1a; &#x…

【xhs爬虫软件】把小红书评论comment接口封装成GUI采集工具!

用Python开发爬虫采集软件&#xff0c;可自动抓取小红书评论数据&#xff0c;并且含二级评论。 小红书的评论接口URL是&#xff1a; https://edith.xiaohongshu.com/api/sns/web/v2/comment/page 开发者模式分析过程&#xff1a; 进而封装成GUI界面软件&#xff0c;如下&…

17.基础乐理-调式、自然大调式(C大调、D大调。。。)

调式&#xff1a; 若干个音&#xff0c;按照某种规则排列起来&#xff0c;就是调式&#xff0c;调式是一个非常大&#xff0c;非常抽象的概念&#xff0c;调式这两个字是一个统称&#xff0c;当明确了 若干个音 到底有几个音&#xff0c;某种规则到底是什么规则之后&#xff0c…

【精】Devops实战学习CI/CD落地方案#CI篇#

目录 先有个大概了解 基本概念 CI/CD Devops 阿里云效 devops产品 K8s jenkins docker git maven 知行合一&#xff0c;上手操作 实操记录 安装VMware 安装并配置虚拟机 安装并配置docker docker安装 修改镜像源&#xff08;关键且易出错&#xff09; CentOS…