I use the DrawText function in the DrawHUD call in c++ to draw strings and It works correctly when i play in the editor buy when i play it after packaging no strings are displayed
I Use the following code to display strings on the screen:
.h
#pragma once
#include "GameFramework/HUD.h"
#include "MainHUD.generated.h"
USTRUCT(BlueprintType)
struct FDisplayString
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MOO)
FString Text;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MOO)
FVector2D Position;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MOO)
FColor Color;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MOO)
FVector2D Scale;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MOO)
int32 DisplayTime;
int32 StartTime;
};
/**
*
*/
UCLASS()
class MOONSHINEWORKS_API AMainHUD : public AHUD
{
GENERATED_BODY()
public:
AMainHUD(const class FObjectInitializer& PCIP);
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MOO)
UFont* Font;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MOO)
TArray<FDisplayString> DisplayStrings;
UFUNCTION(BlueprintCallable, Category = MOOnshine)
void AddDisplayString(FDisplayString DisplayStringToAdd);
protected:
void DrawHUD() override;
virtual void Tick(float DeltaSeconds) override;
};
.cpp
#include "MOOnshineWorks.h"
#include "MainHUD.h"
AMainHUD::AMainHUD(const class FObjectInitializer& PCIP)
: Super(PCIP)
{
}
void AMainHUD::DrawHUD()
{
Super::DrawHUD();
int DisplayStringsCount = DisplayStrings.Num();
for (int i = DisplayStringsCount - 1; i >= 0; i--)
{
FDisplayString* DisplayString = &DisplayStrings[i];
FVector2D Position = FVector2D(DisplayString->Position.X, DisplayString->Position.Y + i * 20);
DrawText(DisplayString->Text, Position, Font, DisplayString->Scale, DisplayString->Color);
}
}
void AMainHUD::AddDisplayString(FDisplayString DisplayStringToAdd)
{
int32 DisplayStringsCount = DisplayStrings.Num();
for (int32 i = 0; i < DisplayStringsCount; i++)
{
if (DisplayStrings[i].Text == DisplayStringToAdd.Text)
{
return;
}
}
DisplayStringToAdd.StartTime = FDateTime::Now().ToUnixTimestamp();
DisplayStrings.Add(DisplayStringToAdd);
}
void AMainHUD::Tick(float DeltaSeconds)
{
Super::Tick(DeltaSeconds);
int DisplayStringsCount = DisplayStrings.Num();
FDateTime CurrentTime = FDateTime::Now();
for (int i = DisplayStringsCount - 1; i >= 0; i--)
{
FVector2D Position = FVector2D(DisplayStrings[i].Position.X, DisplayStrings[i].Position.Y + i * 20);
if (DisplayStrings[i].DisplayTime == 0)
{
DisplayStrings.RemoveAt(i, 1);
}
else if (DisplayStrings[i].DisplayTime <= CurrentTime.ToUnixTimestamp() - DisplayStrings[i].StartTime)
{
DisplayStrings.RemoveAt(i, 1);
}
}
}