Extending Gameplay Debugger

From UE4: Community Wiki
Jump to: navigation, search


Gameplay Debugger[edit]

I bet lots of you already are familiar with Unreals Gameplay Debugger. It’s a great tool that let us see very useful information in a convenient way. Whats cool about it is that it doesn’t just display text. It also show information about AI Perception and EQS visually making it super easy to debug. The best part is that it’s super easy to extend.

Base setup[edit]

Although extending Gameplay Debugger can be achieved within same module as your game I’d rather recommend doing it in a separate module hence link to the article about module creation here. All further steps assume you have separate module.

Creating new category[edit]

First of, add GameplayDebugger module to your ModuleName.Build.cs file under dependencies modules.

Now create custom class that will inherit from FGameplayDebuggerCategory. To stick with Unreals convention of already existing classes (like AI, BehaviorTree etc.) I’d suggest naming it FGameplayDebuggerCategory_CategoryName. I’ll use FGameplayDebuggerCategory_Generic name in this example.

GameplayDebuggerCategory_Generic.h:

#pragma once

#if WITH_GAMEPLAY_DEBUGGER

#include "CoreMinimal.h";
#include "GameplayDebuggerCategory.h";

class APlayerController;
class AActor;

class FGameplayDebuggerCategory_Generic : public FGameplayDebuggerCategory
{
public:
    FGameplayDebuggerCategory_Generic();
    void CollectData(APlayerController* OwnerPC, AActor* DebugActor) override;
    void DrawData(APlayerController* OwnerPC, FGameplayDebuggerCanvasContext& CanvasContext) override;
    
    static TSharedRef<FGameplayDebuggerCategory> MakeInstance();
    
protected:
    struct FRepData
    {
        // Put all data you want to display here
        FString ActorName;
        
        void Serialize(FArchive& Ar);
    };
    
    FRepData DataPack;
};

#endif // WITH_GAMEPLAY_DEBUGGER

GameplayDebuggerCategory_Generic.cpp:

#include "GameplayDebuggerCategory_Generic.h";

#if WITH_GAMEPLAY_DEBUGGER

#include "GameFramework/Actor.h";
#include "GameFramework/PlayerController.h";

FGameplayDebuggerCategory_Generic::FGameplayDebuggerCategory_Generic()
{
    SetDataPackReplication<FRepData>(&DataPack);
}

void FGameplayDebuggerCategory_Generic::CollectData(APlayerController* OwnerPC, AActor* DebugActor)
{
    if (OwnerPC)
    {
        DataPack.ActorName = OwnerPC->GetPawn()->GetName();
    }
}

void FGameplayDebuggerCategory_Generic::DrawData(APlayerController* OwnerPC, FGameplayDebuggerCanvasContext& CanvasContext)
{
    if (!DataPack.ActorName.IsEmpty())
    {
        CanvasContext.Printf(TEXT("{yellow}Actor name: {white}%s"), *DataPack.ActorName);
    }
}

TSharedRef<FGameplayDebuggerCategory> FGameplayDebuggerCategory_Generic::MakeInstance()
{
    return MakeShareable(new FGameplayDebuggerCategory_Generic());
}

void FGameplayDebuggerCategory_Generic::FRepData::Serialize(FArchive& Ar)
{
    Ar << ActorName;
}

#endif // WITH_GAMEPLAY_DEBUGGER

This simple template will display the name of debug actor under newly created category. Now we need to register new category inside our module startup function.

On top of your module source file include gameplay debugger and our new category:

#if WITH_GAMEPLAY_DEBUGGER
    #include "GameplayDebugger.h";
    #include "GameplayDebuggerCategory_Generic.h";
#endif // WITH_GAMEPLAY_DEBUGGER

Now in startup function register new category:

/*...*/
#if WITH_GAMEPLAY_DEBUGGER
    IGameplayDebugger& GameplayDebuggerModule = IGameplayDebugger::Get();
    GameplayDebuggerModule.RegisterCategory("Generic", IGameplayDebugger::FOnGetCategory::CreateStatic(&FGameplayDebuggerCategory_Generic::MakeInstance), EGameplayDebuggerCategoryState::EnabledInGameAndSimulate, 1);
    GameplayDebuggerModule.NotifyCategoriesChanged();
#endif
/*...*/

Result[edit]

Now regenerate project solution and you are ready to go. Launch the PIE and hit the ' button to see your new category up and running.

Result.png

If you want to change binding key or default visibility of categories you can do so by opening Project Settings under Gameplay Debugger tab.

For more references how to draw your debug things you can take a look into GameplayDebuggerCategory_BehaviorTree or GameplayDebuggerCategory_EQS.