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

本篇讲解一下使用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,而想要拥有护盾额外伤害,只需要修改对应的属性值即可。

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

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

相关推荐
Footprint_Analytics17 小时前
Footprint Analytics 助力 Sei 游戏生态增长
游戏·web3·区块链
半盏茶香21 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
PandaQue1 天前
《怪物猎人:荒野》游戏可以键鼠直连吗
游戏
白狐欧莱雅1 天前
使用python中的pygame简单实现飞机大战游戏
经验分享·python·游戏·pygame
豆本-豆豆奶1 天前
用 Python 写了一个天天酷跑(附源码)
开发语言·python·游戏·pygame·零基础教程
Leoysq2 天前
【UGUI】实现点击注册按钮跳转游戏场景
游戏·unity·游戏引擎·ugui
zsc_1182 天前
(C++回溯算法)微信小程序“开局托儿所”游戏
c++·算法·游戏
中云DDoS CC防护蔡蔡2 天前
棋牌游戏防ddos攻击,高防IP好用吗?
运维·服务器·游戏·网络安全·ddos
dangoxiba3 天前
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十八集补充:制作空洞骑士独有的EventSystem和InputModule
游戏·unity·c#·游戏引擎·playmaker
ToDesk_Daas3 天前
为什么越来越多人开始用云电脑?网友道出了真相
科技·游戏·电脑