本篇讲解一下使用GAS实现护盾机制的方法。
飞书文档
虚幻回合制游戏战斗框架jfpejv68no.feishu.cn/docx/YFATdbdQfouMtAxYqCCcacVPnkd
护盾机制的实现
首先谈一谈我设想的一种护盾实现机制,很简单,但是能够很方便的实现护盾的堆叠和抵消伤害。
在游戏代码中,会同时存在Shield 和ShieldMax两个属性。Shield为实际的护盾值,用于抵扣伤害。
所有的护盾作为一个有持续时间的buff,只会修改ShieldMax属性,当ShildMax增加delta时,则Shield会相应的增加delta数值。
当护盾buff到了持续时间消失,若新的ShieldMax大于Shield,则不需要修改护盾值。如果新的ShieldMax小于Shield,则修改Shield让它小于等于ShieldMax。
如果收到伤害,则Shield减少对应的值。
OK,护盾逻辑只需要遵循以上三条逻辑,就可以很简单的实现了。
接下来用几个实际情况来举例。假设游戏中有七月三和卓鸭两个角色
- 七月三对卓鸭施加了一个持续两回合的300数值的护盾,卓鸭此时护盾值为300/300
- 卓鸭被敌人攻击,造成了100点伤害,卓鸭此时的护盾值为200/300
- 卓鸭受到伤害后会获得一个200的护盾,此时的护盾值为400/500
- 七月三给予的护盾持续时间结束,卓鸭的护盾最大值减少300,护盾值变为200/200
接下来再举一个例子
- 七月三对卓鸭施加了一个持续两回合的300数值的护盾,卓鸭此时护盾值为300/300
- 卓鸭被敌人攻击,造成了200点伤害,卓鸭此时的护盾值为10/300
- 卓鸭受到伤害后会获得一个200的护盾,此时的护盾值为300/500
- 卓鸭被敌人攻击,造成了200点伤害,卓鸭此时的护盾值为100/500
- 七月三给予的护盾持续时间结束,卓鸭的护盾最大值减少300,护盾值变为100/200
是不是很简单就实现了一个护盾的效果!
代码实现
- 定义护盾值和护盾最大值两个属性
- 创建函数,用于在某个属性最大值改变后,修改对应属性的数值
- 重写Pre属性修改函数
当修改的属性为护盾最大值时,调用AdjustAttributeForMaxChange函数
- 对伤害的处理,这里建议使用一个中间属性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,而想要拥有护盾额外伤害,只需要修改对应的属性值即可。
三种方法各有优劣,也有各自适合的使用场景,需要自己去选择了。
如果还有其它想要了解的机制实现,可以给我评论或私信。如果有人对护盾的机制和功能需要更详细的代码讲解,在评论区告诉我吧。