開発環境
UE4.21.2
VisualStudio 2017
#手順
- FOutputDeviceを継承するクラスを作成する
- Serialize関数を作成
- 渡された文字列をGLogからデバイス登録をする
- アウトプットログに出力される処理を実行する(ログ、コンソールコマンドなど)
- 出力し終わったら再びGLogからデバイス登録を解除
#実際のコード
※専用のUMGを用意するのがめんどくさいので出力方法をImGUIライブラリを使っている.実際に使う際は適当なクラスなり変数なり用意してほしい
ConsoleActor.cpp
#include "ConsoleActor.h"
#include <imgui.h>
namespace
{
TArray<FString> strArray;
}
class CONSOLETEST_API FConsoleDevice : public FOutputDevice//手順1
{
public:
FConsoleDevice()
{
}
//手順2(consoleに吐き出されるlog情報が1行ごとに渡される)
virtual void Serialize(const TCHAR* Data, ELogVerbosity::Type Verbosity, const class FName& Category, const double Time) override
{
strArray.Insert(Data, 0);
}
//手順2
virtual void Serialize(const TCHAR* Data, ELogVerbosity::Type Verbosity, const class FName& Category) override
{
strArray.Insert(Data, 0);
}
};
void AConsoleActor::OutputStr(const FString& str)
{
FConsoleDevice device;
GLog->AddOutputDevice(&device);//手順3
UE_LOG(LogClass, Log, TEXT("output -> %s"), *str);//手順4
GLog->RemoveOutputDevice(&device);//手順5
}
// Called when the game starts or when spawned
void AConsoleActor::BeginPlay()
{
Super::BeginPlay();
OutputStr("AAAAAAAAAAAAAAAAAA");
OutputStr("BBBBBBBBBBBBBBBBBB");
OutputStr("CCCCCCCCCCCCCCCCCC");
}
// Called every frame
void AConsoleActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
//取得したログのゲーム内への出力方法は各々で考えてください
ImGui::NewFrame();
Super::Tick(DeltaTime);
//setting
ImGui::SetNextWindowPos(ImVec2(50, 20), ImGuiCond_Always);
ImGui::SetNextWindowSize(ImVec2(550, 300), ImGuiCond_Always);
ImGui::SetNextWindowBgAlpha(0.5f);
bool isVisiableCloseBtn = true;
//Draw
if (ImGui::Begin("Console"), isVisiableCloseBtn)
{
for (int i = 0; i < strArray.Num(); i++)
{
ImGui::Text("%s", TCHAR_TO_ANSI(*mBuffer[i]));
}
}
ImGui::End();
}