斯坦福 UE4 C++ ActionRoguelike游戏实例教程 14. 使用GameplayTag实现防守反击技能
斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论
概述
本篇文章对应Lecture 17 - GameplayTags, 70节。本文将会结合前几节课使用的能力系统和GameplayTag系统,实现一个防守反击的技能,按下R键,即可在1秒钟内反弹魔法子弹的攻击。
如果不清楚能力系统可以查看之前写的文章https://www.cnblogs.com/Qiu-Bai/p/17326408.html

防守反击技能
如果玩过守望先锋,想必会对源氏的E技能“闪”印象深刻,该技能在两秒钟内反弹源氏面前的所有投射类物体,无论是子弹还是各种技能。

而这篇文章,将会实现一个简易版的防守反击技能,在你按下释放键后,将会给你一个持续一段时间的“招架”状态,此时会反弹所有打向你的魔法子弹。
我们将使用GamePlayTag来实现状态的赋予。原理很简单,当我们按下技能键后,会给角色上一个“招架(parring)”的Tag,当子弹打到角色身上时,会检查角色身上的Tag,如果有parry的Tag,那么就将其速度和方向取反。具体怎么实现,我们边做边说。
由于是子弹检测角色身上的Tag,所以检测Tag部分的逻辑我们写在子弹的类中。
如下所示,我们在头文件中定义了要检测的Tag类型 ParryTag,并修改了OnOverlapBegin里面的部分逻辑,添加了了检测目标角色身上的Tag,如果目标身上有指定的ParryTag,就将子弹的速度取反,并重新设置Instigator。
//SurMagicProjectile.h
protected:
UPROPERTY(EditAnywhere, Category = "Tags")
FGameplayTag ParryTag;
//SurMagicProjectile.cpp
void ASurMagicProjectile::OnOverlapBegin(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
if(OtherActor && OtherActor != GetInstigator())
{
// 被魔法球攻击的Actor如果有ParryTag,那么它将反弹魔法球
USurActionComponent* ActionComp = Cast<USurActionComponent>(OtherActor->GetComponentByClass(USurActionComponent::StaticClass()));
if (ActionComp && ActionComp->ActiveGameplayTags.HasTag(ParryTag))
{
MoveComp->Velocity = -MoveComp->Velocity;
SetInstigator(Cast<APawn>(OtherActor));// 反弹魔法球之后,魔法球的Instigator改为反弹者
return;
}
...
}
}
代码就修改到这边,后面的步骤并不复杂,主要用蓝图实现。
首先添加Parrying的Tag。

值得一提的是,课程里提到为Tag起名并做好分类是非常重要的事情。这里为Parrying添加了Status的前缀,推测其目的是为之后的角色状态相关设计打下基础。熟练的游戏设计者考虑问题总是先人一步,但是作为新手,如果缺乏经验的话,在一开始确实很难想到这么多。
然后是创建招架的技能。继承自前几节课创建的SurAction,将其命名为Action_Parry。将其细节设置如下:

重载StartAction事件,在这个技能持续期间,会为角色的ActionComponent组件添加上Parrying标签(父类StartAction),持续一秒。

注意要将SurAction的StopAction设置为BluprintCallable,否则在蓝图中是无法直接调用的。
延续上面的话题,在项目越来越大的时候,我们应该考虑使用GameplayTag来代替这里使用的FName,因为为能力命名实际上也是一门不小的学问,我们在实现越来越多的Action时,也许会遗忘某个Action的ActionName,或者会疑惑“当时我为什么要这么命名?”,又或者不小心打错了某个字符,在后期开发了几百上千个Action后,为每个Action命名也是相当繁琐且困难的。
但是,如果用标签的组合来标识每一个Action的话,也许在开发新Action的时候就会省力很多,毕竟我们可以自由选择标签组合来赋予Action特征和属性,也不用不厌其烦地为Action起名了。当然,这一切的前提是你有一套足够合理的标签系统,这又是一门大学问了。现在我们的项目只是为了练手和入门,就先不考虑这些了。
技能创建好后,为技能绑定按键。这里将其设置为R键。

在我们的角色类中,为该键绑定事件,和之前一样,直接调用ActionComponent的StartActionByName。注意Action Name要和技能里的Fname一样。

为角色添加默认技能:

对了,前面还为子弹添加了一个ParryTag成员。别忘了为子弹设置好要检测的标签。

进入游戏看看效果,当AI小兵向我们发射子弹的时候,我眼疾手快,按下R键释放格挡反击技能。左上角提示,现在角色带有了Parry标签,子弹命中我的时候,检测到Parry标签,将自己的速度取反,并重新设置Instigator,相当于这个子弹是被我发射出来的。最终,小兵被反弹的子弹击杀。

最后玩点花的,我们可以给AI小兵也加上ActionComponent,为其添加一个parry标签,这样子弹打在小兵身上时就会反弹回来,如果此时我们角色身上也有parry标签,最后双方互相反弹,跟打乒乓球一样,十分有趣。

添加AI角色伤害数字UI
因为这部分东西很少,都是以前做过的内容,出于记录的目的,姑且放在本篇文章中。




总结
本篇文章结合了前面实现过的Action System和UE中的GameplayTag系统,实现了可以反弹子弹的格挡反击技能。
注意到利用GamePlayTag实现这些效果并没有与特定的Actor或者组件相关联,我们可以将游戏标签用在游戏项目里的各种地方上,大大降低了程序的耦合性,这是游戏标签非常棒的特点之一。
通过这几节课的学习,我们已经基本掌握了GameplayTag的基本用法,除此以外,它还有大量的用法尚待发掘,相信在学完了这几节课后,大家对游戏的开发会更加得心应手。
斯坦福 UE4 C++ ActionRoguelike游戏实例教程 14. 使用GameplayTag实现防守反击技能的更多相关文章
- Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物
如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~ 所以.必须可配置.不然会累死人的. ; i < size; ++i) { int id = root[i][&quo ...
- Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编辑器
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/musicvs/article/details/25368273 好吧.我真心全然搞不懂.我如今仅仅只 ...
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇:简介及目录》(附上完整工程文件)
G-3D引擎2D射击类游戏制作教程 游戏类型: 打飞机游戏属于射击类游戏中的一种,可以划分为卷轴射击类游戏. 视觉表现类型为:2D 框架简介: Genesis-3D引擎不仅为开发者提供一个3D游戏制作 ...
- 值得 Web 开发人员收藏的20个 HTML5 实例教程
当开始学习如何创建 Web 应用程序或网站的时候,最流行的建议之一就是阅读教程,并付诸实践.也有大量的 Web 开发的书,但光有理论没有实际行动是无用的.现在由于网络的发展,我们有很多的工具可以用于创 ...
- 3Ds Max实例教程-制作女战士全过程
3Ds Max制作“女战神” 作者:Diego Rodríguez 使用软件:3Ds Max,Photoshop 3Ds Max下载:http://wm.makeding.com/iclk/?zone ...
- 深度学习与CV教程(14) | 图像分割 (FCN,SegNet,U-Net,PSPNet,DeepLab,RefineNet)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- 值得 Web 开发人员学习的20个 jQuery 实例教程
这篇文章挑选了20个优秀的 jQuery 实例教程,这些 jQuery 教程将帮助你把你的网站提升到一个更高的水平.其中,既有网站中常用功能的的解决方案,也有极具吸引力的亮点功能的实现方法,相信通过对 ...
- Web 开发中应用 HTML5 技术的10个实例教程
HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...
- 《HTML5与CSS3实例教程》
<HTML5与CSS3实例教程> 基本信息 作者: (美)Brian P. Hogan 译者: 卢俊祥 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:97871153634 ...
随机推荐
- 详解RecyclerView的预布局
概述 RecyclerView 的预布局用于 Item 动画中,也叫做预测动画.其用于当 Item 项进行变化时执行的一次布局过程(如添加或删除 Item 项),使 ItemAnimator 体验更加 ...
- python第6章 学习笔记
# 第6章 学习笔记## 简介 Python代码在执行时是按照自上向下顺序执行的. 通过流程控制语句,可以改变程序的执行顺序,也可以让指定的程序反复执行多次 流程控制语句分成两大类:条件判断语句,循环 ...
- 人工智能AI绘画全攻略(AI绘画教程分享)
在过去的三个月一直在研究人工智能生成绘画这个方向,3 月份的时候参加了小红书的小航海,也因为这个方向的选择正好对应到了趋势,小红书在一个半月做到了 1 万粉.我为什么看好这个方向? 主要是从三个方面: ...
- Chrome Extensions v3 迁移清单
一.前置问题 1.1为什么需要迁移 v3? Chrome 计划完全停止 v2 版本维护,后续 v2 版本将无法上架谷歌插件商店,除此之外,未来新版本 Chrome 对于 v2 版本插件的限制会越来越大 ...
- JS逆向实战24—— 补环境过某房地产瑞数4.0
前言 瑞数就不过多介绍了,算是国内 2 线产品中的天花板了.4 代其实难度不高,但要弄出来 确实挺费时间和耐心的.今天就简单来讲讲如何用补环境轻松的过瑞数. 本文首发链接为: https://mp.w ...
- FreeSWITCH添加自定义endpoint之api及app开发
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 之前写过FreeSWITCH添加自定义endpoint的文章,今天整理下api及app开发的笔记.历史文章可参考如下 ...
- 2023寒鹭Tron-CTF迎新赛 CRYPTO Misc 全WP
CRYPTO 简简单单 1.题目信息 U2FsdGVkX1+2gTXPuTetdM1p+IETUDXAHe2eC33jQfgdJoOmmrJq 2.解题方法 兔子密码,在线工具直接解 简简单单2 1. ...
- kubeadm 添加master及node
1.添加master 新master服务器初始化 添加k8s源 $ cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] ...
- JavaScript:数据类型详解
ECMAScript中数据类型目前有两种:基本数据类型和引用数据类型. 基本数据类型 基本数据类型也称作简单数据类型,为Undefined,Null,Boolean,Number,String,Sym ...
- [学习笔记]TypeScript查缺补漏(二):类型与控制流分析
@ 目录 类型约束 基本类型 联合类型 控制流分析 instanceof和typeof 类型守卫和窄化 typeof判断 instanceof判断 in判断 内建函数,或自定义函数 赋值 布尔运算 保 ...