虚幻回合制游戏战斗框架-护盾的实现

本篇讲解一下使用GAS实现护盾机制的方法。

飞书文档

虚幻回合制游戏战斗框架​jfpejv68no.feishu.cn/docx/YFATdbdQfouMtAxYqCCcacVPnkd

护盾机制的实现

首先谈一谈我设想的一种护盾实现机制,很简单,但是能够很方便的实现护盾的堆叠和抵消伤害。

在游戏代码中,会同时存在ShieldShieldMax两个属性。Shield为实际的护盾值,用于抵扣伤害。

所有的护盾作为一个有持续时间的buff,只会修改ShieldMax属性,当ShildMax增加delta时,则Shield会相应的增加delta数值。

当护盾buff到了持续时间消失,若新的ShieldMax大于Shield,则不需要修改护盾值。如果新的ShieldMax小于Shield,则修改Shield让它小于等于ShieldMax。

如果收到伤害,则Shield减少对应的值。

OK,护盾逻辑只需要遵循以上三条逻辑,就可以很简单的实现了。

接下来用几个实际情况来举例。假设游戏中有七月三和卓鸭两个角色

  1. 七月三对卓鸭施加了一个持续两回合的300数值的护盾,卓鸭此时护盾值为300/300
  2. 卓鸭被敌人攻击,造成了100点伤害,卓鸭此时的护盾值为200/300
  3. 卓鸭受到伤害后会获得一个200的护盾,此时的护盾值为400/500
  4. 七月三给予的护盾持续时间结束,卓鸭的护盾最大值减少300,护盾值变为200/200

接下来再举一个例子

  1. 七月三对卓鸭施加了一个持续两回合的300数值的护盾,卓鸭此时护盾值为300/300
  2. 卓鸭被敌人攻击,造成了200点伤害,卓鸭此时的护盾值为10/300
  3. 卓鸭受到伤害后会获得一个200的护盾,此时的护盾值为300/500
  4. 卓鸭被敌人攻击,造成了200点伤害,卓鸭此时的护盾值为100/500
  5. 七月三给予的护盾持续时间结束,卓鸭的护盾最大值减少300,护盾值变为100/200

是不是很简单就实现了一个护盾的效果!

代码实现

  1. 定义护盾值和护盾最大值两个属性
  1. 创建函数,用于在某个属性最大值改变后,修改对应属性的数值
  1. 重写Pre属性修改函数

当修改的属性为护盾最大值时,调用AdjustAttributeForMaxChange函数

  1. 对伤害的处理,这里建议使用一个中间属性Damage Attribute去计算伤害,而不是直接修改生命和护盾

根据伤害修改护盾值和生命值

护盾的技能效果

然后谈谈护盾一些技能效果应该如何实现。这里只谈大概的思路,因为我也懒得写代码了(瘫倒),代码这种东西怎么实现都行,不重要,有了思路之后写是很简单的。

反击

我们游戏的角色七月三除了可以给队友施加护盾,当拥有护盾的队友被敌人攻击时,还可以对攻击者进行反击,释放一次攻击。

首先创建一个收到伤害的委托,角色每次收到伤害都会广播,这里建议可以直接使用Lyra的Message Router作为消息的发送和接受(参考飞书文档最后结尾的unreal tips)

创建一个DamageEvent用于存储伤害相关的数据

如何表明本次伤害有护盾伤害有很多的方法,我这边用的是一个Tag Container存储所有的伤害tag信息。如果对护盾造成伤害那么就带有一个Damage.Info.Shield的tag即可。

收到消息后先判断被攻击的是不是自己的队友收到了护盾伤害,如果是则使用我上一篇的Action System插入一次反击技能即可。(参考上一篇文,或者飞书文档里的技能-连击模块)

护盾打击

攻击可以附加护盾值的额外伤害。这里还是有很多的实现方法,我这里给出三种的实现方法。

一种方法是参考我飞书文档里,技能-伤害-动态伤害模块里的写法,写一个被动技能,会给角色添加一个damage adjustment,这样角色每次制造伤害时可以额外的添加护盾的伤害。这种方法是当时设计出来最万能的,可以几乎调整任何情况下技能的伤害,但是相对也比较麻烦。

还有一种写法是比较简单,所有的伤害通过一个通用的函数去apply effect,当角色身上拥有某个tag时,通过Set By Caller额外输入护盾值作额外伤害数据,然后伤害计算时读取对应的值加到伤害里。

最后一种方法是,增加一个属性,叫做ShieldToDamagePercent,所有伤害计算时,伤害值都会增加ShieldToDamagePercent * Shield,而想要拥有护盾额外伤害,只需要修改对应的属性值即可。

三种方法各有优劣,也有各自适合的使用场景,需要自己去选择了。

如果还有其它想要了解的机制实现,可以给我评论或私信。如果有人对护盾的机制和功能需要更详细的代码讲解,在评论区告诉我吧。

相关推荐
李詹13 小时前
Steam游戏服务器攻防全景解读——如何构建游戏级抗DDoS防御体系?
服务器·游戏·ddos
程序员爱钓鱼1 天前
从零开始开发一个简易的五子棋游戏:使用 HTML、CSS 和 JavaScript 实现双人对战
前端·javascript·游戏开发
264玫瑰资源库2 天前
斗鱼娱乐电玩平台源码搭建实录
运维·服务器·游戏·娱乐
韩仔搭建2 天前
美乐迪电玩大厅加载机制与 RoomList 配置结构分析
游戏·小程序·开源·lua
w4ngzhen2 天前
关于Bevy中的原型Archetypes
rust·游戏开发
二狗哈2 天前
制作一款打飞机游戏21:自定义工具
游戏
@正在学习驰骋的小马2 天前
九、小白如何用Pygame制作一款跑酷类游戏(添加前进小动物作为动态障碍物)
python·游戏·pygame
264玫瑰资源库2 天前
问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)
java·开发语言·前端·游戏
微网兔子2 天前
伺服器用什么语言开发呢?做什么用什么?
服务器·c++·后端·游戏
二狗哈3 天前
制作一款打飞机游戏20:敌人被击中时的视觉效果
游戏