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

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

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

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

相关推荐
la_vie_est_belle2 小时前
《Cocos Creator游戏实战》非固定摇杆实现原理
游戏·cocos creator·游戏开发·cocos·非固定摇杆
Thomas_YXQ3 小时前
Unity3D Huatuo技术原理剖析详解
unity·unity3d·游戏开发·性能调优·热更新
火云洞红孩儿4 小时前
基于AI IDE 打造快速化的游戏LUA脚本的生成系统
c++·人工智能·inscode·游戏引擎·lua·游戏开发·脚本系统
zh路西法6 小时前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(二):从FSM开始的2D游戏角色操控底层源码编写
c++·游戏·unity·设计模式·状态模式
soragui6 小时前
【ChatGPT】OpenAI 如何使用流模式进行回答
linux·运维·游戏
番茄电脑全能王11 小时前
《鸣潮》运行时提示找不到emp.dll是什么原因?缺失emp.dll文件要怎么解决?
网络·数据库·经验分享·游戏·电脑
Artistation Game12 小时前
一、c#基础
游戏·unity·c#·游戏引擎
番茄电脑全能王13 小时前
《诛仙世界》游戏运行时提示d3dx9_43.dll丢失怎么办?d3dx9_43.dll丢失要怎么解决?
游戏
番茄电脑全能王13 小时前
《战神:诸神黄昏》游戏运行时提示找不到emp.dll怎么办?emp.dll丢失如何修复?
经验分享·游戏·电脑
m0_748251722 天前
Android webview 打开本地H5项目(Cocos游戏以及Unity游戏)
android·游戏·unity