DEV Community

Adriel Werlich
Adriel Werlich

Posted on

Chapter 2 - Converting blueprint in Cpp - BeginPlay

Chapter 2 - Converting the BeginPlay hook into C++ script

  • The Event BeginPlay in blueprint/visual scritp

Image description

This BeginPlay event for the Bot Player Blueprint does the following:

  1. Sequence Node: Splits execution into three parallel branches.
  2. SetInputMappingContext: Calls a collapsed graph to set up input mappings.
  3. InitFireMode: Calls a collapsed graph to initialize the fire mode.
  4. CreateCrosshairWidget: Calls a collapsed graph to create the crosshair UI.
  5. SetTag: Sets a tag on the actor (likely for identification).
  6. Get All Actors of Class (BP_Enemy_Spawn): Finds all enemy spawn actors in the level.
  7. Bind Event to On All Enemies Defeated: Binds a custom event (Event_ShowLevelClearedMessage) to an event dispatcher on the enemy spawner(s).
  8. Event_ShowLevelClearedMessage: Custom event that, when triggered, calls ShowLevelClearedMessage on self, passing a message to display.

How to Convert This to C++

Below is a C++ outline for your BeginPlay logic. You’ll need to implement or stub out the collapsed graphs as C++ functions.

#include "BotPlayer.h"
#include "Kismet/GameplayStatics.h"
#include "BP_Enemy_Spawn.h" // Replace with your actual enemy spawn class header

void ABotPlayer::BeginPlay()
{
    Super::BeginPlay();

    // 1. Set up input mapping context
    SetInputMappingContext();

    // 2. Initialize fire mode
    InitFireMode();

    // 3. Create crosshair widget
    CreateCrosshairWidget();

    // 4. Set tag on this actor
    this->Tags.Add(FName("PlayerTag")); // Replace "PlayerTag" with the actual tag

    // 5. Get all enemy spawners in the level
    TArray<AActor*> EnemySpawners;
    UGameplayStatics::GetAllActorsOfClass(GetWorld(), ABP_Enemy_Spawn::StaticClass(), EnemySpawners);

    // 6. Bind event to OnAllEnemiesDefeated for each spawner
    for (AActor* SpawnerActor : EnemySpawners)
    {
        ABP_Enemy_Spawn* Spawner = Cast<ABP_Enemy_Spawn>(SpawnerActor);
        if (Spawner)
        {
            // Assuming the spawner has a delegate like:
            // DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnAllEnemiesDefeated);
            // UPROPERTY(BlueprintAssignable) FOnAllEnemiesDefeated OnAllEnemiesDefeated;
            Spawner->OnAllEnemiesDefeated.AddDynamic(this, &ABotPlayer::ShowLevelClearedMessage);
        }
    }
}

// Example stub implementations for the collapsed graphs:
void ABotPlayer::SetInputMappingContext()
{
    // Implement input mapping setup here
}

void ABotPlayer::InitFireMode()
{
    // Implement fire mode initialization here
}

void ABotPlayer::CreateCrosshairWidget()
{
    // Implement crosshair widget creation here
}

// This function will be called when all enemies are defeated
void ABotPlayer::ShowLevelClearedMessage()
{
    // Implement logic to show the level cleared message
}
Enter fullscreen mode Exit fullscreen mode

Key Points:

  • Replace "YourTag" with the actual tag you want to set.
  • Replace ABP_Enemy_Spawn with your actual enemy spawner C++ class.
  • The delegate/event system assumes your enemy spawner has a BlueprintAssignable multicast delegate for "all enemies defeated."
  • Implement the collapsed graph logic as C++ member functions.

Next is to convert each variable, function, node graph or macro into C++ code.
For example in the blueprint we have the "CreateCrosshairWidget" that creates the target/crosshair widget in the center of the screen

Image description

The CreateCrosshairWidget function does the following:

  1. Gets the Player Controller (index 0).
  2. Creates a User Widget of a specified Widget Blueprint Class, with the player controller as the owning player.
  3. Stores the created widget in a variable (WidgetBlueprint).
  4. Adds the widget to the viewport so it appears on the screen.

C++ Conversion

Header File (BotPlayer.h)


// ...existing code...

#include "Blueprint/UserWidget.h"

UCLASS()
class YOURGAME_API ABotPlayer : public APawn
{
    GENERATED_BODY()

public:
    ABotPlayer();

    // The crosshair widget class to use (set this in the editor)
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="UI")
    TSubclassOf<UUserWidget> WidgetBlueprintClass;

    // The created widget instance
    UPROPERTY()
    UUserWidget* WidgetBlueprint;

    // Function to create the crosshair widget
    void CreateCrosshairWidget();
Enter fullscreen mode Exit fullscreen mode

Source File (BotPlayer.cpp)

#include "BotPlayer.h"
#include "Blueprint/UserWidget.h"
#include "Kismet/GameplayStatics.h"

void ABotPlayer::CreateCrosshairWidget()
{
    // Get the player controller
    APlayerController* PC = UGameplayStatics::GetPlayerController(GetWorld(), 0);
    if (PC && WidgetBlueprintClass)
    {
        // Create the widget
        WidgetBlueprint = CreateWidget<UUserWidget>(PC, WidgetBlueprintClass);
        if (WidgetBlueprint)
        {
            // Add it to the viewport
            WidgetBlueprint->AddToViewport();
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Summary:

  • The function gets the player controller, creates the widget, stores it in a variable, and adds it to the viewport—just like the Blueprint version.
  • Make sure to set WidgetBlueprintClass in the editor to your crosshair widget Blueprint.

Top comments (0)