介绍
战斗系统通常涉及到多个方面,如输入绑定,技能激活与否,碰撞判定成功与否,伤害计算正确与否,战斗结果正确与否。
战斗系统相比一般其他的系统,更难以调试和定位问题。
本文介绍常规调试的思路,它不仅仅适用于GCS,也适用于大多数复杂项目。
通过日志调试
1[Core.Log]2;Logs for generic input system(针对通用输入系统的日志。)3LogGIPS = Verbose4;Logs for generic gameplay abilities (针对通用技能系统的日志。)5LogGGA_Ability = VeryVerbose6LogGGA_AbilitySystem = VeryVerbose7LogGGA_Tasks = VeryVerbose8;Logs for generic combat system (针对通用战斗系统的日志。)9LogGCS = VeryVerbose10LogGCS_Bullet = VeryVerbose11LogGCS_Trace = VeryVerbose12LogAbilitySystem = VeryVerbose13
强烈建议在项目的DefaultEngine.ini中添加如上内容,以开启GCS相关系统的日志。
系统日志会输出系统运行时的大部分细节内容,以帮助你定位问题/排查错误。
通过GameplayDebugger
参考此文档了解如何通过GameplayDebugger对角色当前的Tags,技能等进行调试。
定位问题的流程
每当你认为产生了问题或者Bug时,你可以按照如下思路(从上往下),快速定位到是哪一个方面,从而进行排查。
战斗结果正确与否
若你打中一个人,但没任何效果。
你应该直接在CombatFlow打断点,
若断点执行,那么则可以判定问题出在对战斗结果的处理上(检测AttackResultProcessor的配置,或者检查CombatFlow里的逻辑正确性等)。
如果断点完全没触发,则问题出在下面的某一个流程。
Note
同时你要注意,CombatFlow的回调是通过AttributeSystemComponent转发过来的,你得先确保你有这个组件。
伤害计算正确与否
找到你最终要应用的GE上面的MMC/Execution打断点(比如GCS自带的Execution),在里面打断点。GCS中给予目标的GE一般在攻击定义表里配置的。
如果断点触发,那你得检查你的Execution确实给出了有效的数值输出,如果伤害计算没有给对面造成有效的数值修改,或者Execution所参与的某个属性并不存在(检查AttributeSet到底有没有),则后续的流程都不会触发(战斗结果,表现等)。
如果断点完全没触发,则问题出在下面的某一个流程。
碰撞判定成功与否
GCS中与碰撞检测相关的都采用了碰撞追踪系统,你可以查看它的文档了解如何调试/可视化碰撞判定。
如果没打中任何东西,你应该检查子弹/武器/Montage当前所激活/关联的碰撞检测实例,是否采用了正确的TraceDefinition配置。
如果确实有打中东西,则问题出在下面的某一个流程。
输入触发
GIPS有调试指南可以参考,同时你也可以在所引用的InputChecker/Processor蓝图中打断点来判断输入逻辑是否执行。
如果输入确实有执行,则问题出在下面的某一个流程。
否则问题就是在输入这里,检查输入映射配置,以及输入处理的逻辑正确性。
技能的激活与否
这里列出了调试GAS的常规手段。
首先你的确保目标技能到底给了没(打开对应蓝图,检查调试下拉列表有没有该技能实例。)
然后在对应的技能蓝图中打断点,看是否有执行。有执行,那一般就是技能的内部逻辑错误,没有触发后续的流程。
没有执行,那第一步排查的就是技能内部的CanActiveAbility确保没有自定义逻辑在阻断激活。
其次,才到了最难以排查的环节:配置错误。
技能阻挡/取消标签配置多了,乱了,也会阻碍技能的激活。一般这种情况下最好是提升GAS的Log等级,查Log。
很多时候技能的无法激活,都是因为Tags不满足条件造成的。
