Wyświetlanie Komunikatów na Ekranie i w Dzienniku

Kiedy uczymy się programowania lub próbujemy znaleźć błąd w kodzie, bardzo przydatne jest renderowanie niektórych komunikatów na ekranie lub w dzienniku, aby sprawdzić, czy kod działa tak, jak powinien.

Zanim pokażę funkcje komunikatów, omówię typ FString silnika Unreal Engine. Ten typ jest używany do reprezentowania sekwencji znaków. Użyliśmy typu FString w pierwszej części, aby wyświetlić informacje o graczu na ekranie za pomocą klasy AHUD, jak pokazano w tym artykule.

Klasa FString ma funkcję o nazwie Printf(), która buduje FString na podstawie formatowania tekstu i innych parametrów wstawianych do tekstu. Poniższy przykład pokazuje użycie Printf():

FString PlayerInfo = FString::Printf(TEXT("Rank: %d - Name: %s - Health: %f"), 
                                     3, TEXT("Romero"), 0.4);

/*
  The PlayerInfo variable will have this content:
  "Rank: 3 - Name: Romero - Health: 0.4"
*/

Tekst formatujący zawiera znaki specjalne, które zaczynają się od “%” i zostaną zastąpione wartościami innych parametrów w odpowiedniej kolejności. Znaki specjalne reprezentują różne typy wartości. W przykładzie użyto tych znaków:

  • %d: Używany dla wartości całkowitych w formacie dziesiętnym.
  • %s: Używany do ciągów (sekwencji znaków).
  • %f: Używany do wartości zmiennoprzecinkowych.

Zachowaj ostrożność podczas używania “%s” ze zmiennymi FString. Musisz umieścić operator * przed nazwą zmiennej, jak pokazano w poniższym przykładzie.

FString Name = TEXT("Romero");

FString PlayerName = FString::Printf(TEXT("Player: %s"), *Name);

Aby wyświetlić wiadomość na ekranie, możesz użyć tego kodu:

if(GEngine)
{
  GEngine->AddOnScreenDebugMessage(-1, 8, FColor::Red, TEXT("Test message!"));
}

Spójrzmy na każdą część tego kodu:

  • GEngine: wskaźnik reprezentujący silnik. Aby z niego skorzystać, musisz dodać wiersz #include “Engine / Engine.h” na początku pliku cpp.
  • if (GEngine): Przed użyciem wskaźnika należy sprawdzić, czy jest on prawidłowy. Jeśli GEngine jest pustym wskaźnikiem, wyrażenie if będzie fałszywe, a kod wewnątrz if nie zostanie wykonany. Jeśli GEngine ma jakąkolwiek inną wartość, wyrażenie if będzie prawdziwe i kod zostanie wykonany.
  • AddOnScreenDebugMessage (): funkcja klasy UEngine, która wyświetla komunikat na ekranie.
  • -1: nazwa tego parametru to klucz. Jeśli wpiszesz wartość dodatnią, poprzednia wiadomość z tym samym kluczem zostanie usunięta z ekranu.
  • 8: Ten parametr wskazuje czas w sekundach, przez jaki wiadomość powinna być widoczna na ekranie.
  • FColor :: Red: kolor użyty w wiadomości.
  • TEKST („Wiadomość testowa!”): Wiadomość, która zostanie zapisana na ekranie. Może to być zmienna typu FString.

Edytor Unreal posiada panel Output Log, do którego można uzyskać dostęp z menu Window>Developer Tools>Output Log.

Aby wyświetlić komunikat w dzienniku, użyj tego kodu:

UE_LOG(LogTemp, Warning, TEXT("Test message!"));

LogTemp to kategoria Logów już dostępna w Unreal. Ostrzeżenie to poziom komunikatu dziennika. Komunikaty poziomu ostrzegawczego są wyświetlane na żółto, a komunikaty poziomu błędów są wyświetlane na czerwono. Parametr message akceptuje znaki specjalne w taki sam sposób jak funkcja Printf().

Przykładowe użycie:

Utwórz klasę C++, używając Actor jako klasy nadrzędnej. Użyj nazwy MsgActor dla nowej klasy.

Użyjemy Scene Component jako Root Component, aby aktor miał Location. W pliku MsgActor.h dodaj wskaźnik do USceneComponent poniżej deklaracji konstruktora.

public:	
  // Sets default values for this actor's properties
  AMsgActor();
	
  UPROPERTY(VisibleAnywhere)
  USceneComponent* RootScene;

W pliku MsgActor.cpp, wewnątrz konstruktora, zostanie utworzony USceneComponent, a odniesienie zostanie zapisane w zmiennej RootScene. Następnie RootScene zostanie zdefiniowany jako RootComponent tego aktora.

AMsgActor::AMsgActor()
{
  // Set this actor to call Tick() every frame.
  PrimaryActorTick.bCanEverTick = true;

  RootScene = CreateDefaultSubobject<USceneComponent>("RootScene");
  RootComponent = RootScene;
}

W pliku MsgActor.cpp należy umieść ten kod w funkcji BeginPlay():

void AMsgActor::BeginPlay()
{
  Super::BeginPlay();
    
  FString Message = FString::Printf(TEXT("BeginPlay of %s - Location: %s"), 
                                    *(GetName()), *(GetActorLocation().ToString()) );
  
  if(GEngine)
  {
    GEngine->AddOnScreenDebugMessage(-1, 8, FColor::Red, Message);
  }
  
  UE_LOG(LogTemp, Warning, TEXT("%s"), *Message);  
}

Funkcja GetName() zwraca nazwę instancji. Funkcja GetActorLocation() zwraca FVector. Typ FVector ma funkcję ToString(), która konwertuje zawartość FVector na FString.

Skompiluj kod i dodaj aktor MsgActor do poziomu. Uruchom grę i sprawdź komunikaty na ekranie oraz w oknie dziennika wyjściowego, jak pokazano na poniższym zrzucie ekranu.


Źródło:https://romeroblueprints.blogspot.com/2020/10/showing-messages-on-screen-and-in-log.html