6、Debug GAS

6. Debugging GAS

在调试与GAS相关的问题时,您通常想知道以下内容:

  • “我的Attribute是多少?”
  • “我有哪些GameplayTag?”
  • “我当前有哪些GameplayEffect?”
  • “我有哪些被授予的GameplayAbility,哪些正在运行,哪些被阻止激活?”

GAS提供了两种技术来在运行时回答这些问题 - showdebug abilitysystem 和在 GameplayDebugger 中的Hook

提示: 虚幻引擎喜欢优化C++代码,这使得调试某些函数变得困难。当深入追踪代码时,您可能会很少遇到这种情况。如果将Visual Studio解决方案配置设置为DebugGame Editor仍然无法追踪代码或检查变量,您可以通过将优化函数用UE_DISABLE_OPTIMIZATIONUE_ENABLE_OPTIMIZATION宏包裹来禁用所有优化,或者使用CoreMiscDefines.h中定义的ship variations。这不能用于插件代码,除非您从源代码重建插件。根据它们的功能和位置,这可能或可能不适用于内联函数。调试完成后,请务必移除这些宏!

UE_DISABLE_OPTIMIZATION
void MyClass::MyFunction(int32 MyIntParameter)
{
	// 我的代码
}
UE_ENABLE_OPTIMIZATION

6.1 Showdebug Abilitysystem

在游戏内控制台中输入showdebug abilitysystem。此功能分为三个“页面”。所有三个页面将显示您当前拥有的GameplayTags。在控制台中输入AbilitySystem.Debug.NextCategory以在页面之间循环。

第一页显示您所有AttributesCurrentValueshowdebug abilitysystem的第一页

第二页显示您身上的所有Duration(持续)Infinite(无限) GameplayEffects,它们的堆叠数量,它们提供的GameplayTags,以及它们提供的Modifiersshowdebug abilitysystem的第二页

第三页显示所有已授予您的GameplayAbilities,无论其是否正在运行、是否被阻止激活,以及当前运行的AbilityTasks的状态。 showdebug abilitysystem的第三页

要在目标之间循环(由围绕Actor的绿色矩形棱柱表示),使用PageUp键或NextDebugTarget控制台命令转到下一个目标,使用PageDown键或PreviousDebugTarget控制台命令转到上一个目标。

注意: 为了使能力系统信息根据当前选择的调试Actor更新,您需要在DefaultGame.ini中将bUseDebugTargetFromHud=true设置在AbilitySystemGlobals中,如下所示:

[/Script/GameplayAbilities.AbilitySystemGlobals]
bUseDebugTargetFromHud=true

注意: 为了使showdebug abilitysystem工作,必须在GameMode中选择一个实际的HUD类。否则,命令未找到并返回“Unknown Command”。

6.2 Gameplay Debugger

GAS为Gameplay Debugger添加了功能。使用反引号(‘)键访问Gameplay Debugger。按下数字键盘上的3启用Abilities类别。类别可能会有所不同,具体取决于您拥有的插件。如果您的键盘没有数字键盘,例如笔记本电脑,您可以在项目设置中更改键绑定。

当您想查看其他Characters上的GameplayTagsGameplayEffectsGameplayAbilities时,请使用Gameplay Debugger。不幸的是,它不显示目标的AttributesCurrentValue。它将以屏幕中心的Character为目标。您可以通过在编辑器中的World Outliner中选择它们或通过查看不同的Character并再次按下反引号(‘)来更改目标。当前检查的Character上方有最大的红色圆圈。

Gameplay Debugger

6.3 GAS Logging

GAS源代码包含许多在不同详细级别生成的日志语句。您很可能会看到这些作为ABILITY_LOG()语句。默认的详细级别是Display。任何更高的级别默认不会显示在控制台中。

要更改日志类别的详细级别,请在控制台中输入:

log [category] [verbosity]

例如,要打开ABILITY_LOG()语句,您可以在控制台中输入:

log LogAbilitySystem VeryVerbose

要将其重置为默认值,请输入:

log LogAbilitySystem Display

要显示所有日志类别,请输入:

log list

值得注意的GAS相关日志类别:

日志类别默认详细级别
LogAbilitySystemDisplay
LogAbilitySystemComponentLog
LogGameplayCueDetailsLog
LogGameplayCueTranslatorDisplay
LogGameplayEffectDetailsLog
LogGameplayEffectsDisplay
LogGameplayTagsLog
LogGameplayTasksLog
VLogAbilitySystemDisplay

有关更多信息,请参阅Wiki on Logging