アンリアる! C++入門編 ~対話形式で学ぶUnreal Engine~
BOOTHでUnreal Engine C++入門書を販売していますUnreal Engine上でC++を使って開発するために必要となる基礎知識を一冊の本にまとめた本です。 対話形式によるわかりやすい説明を目指しました。無料の試し読みも可能ですので、ぜひ読んでみてください!
[UE4] CheatManagerを使ったコンソールコマンドの定義

Unreal Engineではゲームプレイ中、コンソールコマンドを利用することによってゲームの挙動をプレイ中に変更できます。
コンソールコマンドはゲームプレイ中の任意のタイミングで実行できるため、特にデバッグ用途で有効です。
いくつかの便利なコンソールコマンドが初期状態で定義されていますが、独自のコンソールコマンドを定義することも可能になっています。
独自のコンソールコマンドを定義することで、開発中のゲームに特化した処理を任意のタイミングで実行できるようになります。

本記事では、CheatManagerを使ってコンソールコマンドを定義する方法について説明します。

コンソールコマンドとは

コンソールコマンドは、レベルエディタビューポート上でキー “` を押すと表示されるコンソールから実行できるコマンドです。

コンソールコマンド

ただし “` はキーボード配列によっては入力できないため、[Project Settings] の [Input] > [Console] > [Console Keys] から適当なキーを追加する必要があります。

コンソールキーの設定

いくつかのコンソールコマンドが標準で提供され、コンソールから実行できます。
例えばStatコマンドは、各処理に対してCPUやGPUの実行時間を表示できるコンソールコマンドです。
開発したゲームで性能のボトルネックになっている処理を探すときに非常に便利なコンソールコマンドです。

コンソールコマンド(GPU実行時間表示)

このように性能を評価しリアルタイムで表示する機能は、ゲームプレイ中に必要なときだけ有効化したいはずです。
ゲームプレイ中に任意のタイミングで有効/無効を切り替えることができるコンソールコマンドは、まさにこの目的にあっています。

CheatManagerを使ったコンソールコマンドの定義

コンソールコマンドを定義するためには、UFUNCTION マクロの引数に exec を追加します。

UFUNCTION(exec)
void SAMPLE_Command();

ただし UFUNCTION マクロの引数に exec を追加できるクラスは、次のクラスに限定されます。

  • Pawn
  • PlayerController
  • CheatManager
  • GameMode
  • PlayerInput
  • HUD

今回はCheatManagerにコンソールコマンドを定義します。
CheatManagerとは、さまざまなデバッグ向けの機能を持つクラスで、ゲームをリリースするときに自動的にCheatManagerのすべての機能が無効になるという効果があります。
このためデバッグ用途にコンソールコマンドを実装する対象として、CheatManagerが最も有力な候補になると言えます。

CheatManagerについてより深く知りたい場合は、公式のドキュメントを参考にするとよいでしょう。

具体例

CheatManagerを継承した独自のクラスを作成し、コンソールコマンドを定義してみましょう。
今回は、コマンドの引数として文字列を受け取り、受け取った文字列をログに出力するコンソールコマンド SAMPLE_OutputLog を定義します。

1. コンソールコマンドの定義

CheatManagerは GameFramework/CheatManager.hUCheatManager として定義されています。
UCheatManager を継承した UOutputLogConsoleCommandManager を定義します。

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/CheatManager.h"

#include "OutputLogConsoleCommand.generated.h"


UCLASS()
class REFERENCEPROEJCT_API UOutputLogConsoleCommandManager : public UCheatManager
{
    GENERATED_BODY()

public:

    // コンソールコマンド「SAMPLE_OutputLog」の定義
    UFUNCTION(exec)
    void SAMPLE_OutputLog(FString Message);
};

コンソールコマンドは、UCheatManager を継承した UOutputLogConsoleCommandManager に定義したメンバ関数 SAMPLE_OutputLog の上にマクロ UFUNCTION(exec) を追加することで定義できます。
メンバ関数名がそのままコンソールコマンド名 になることに注意してください。
コンソールコマンド SAMPLE_OutputLog はコマンド引数として文字列を受け取るため、メンバ関数 SAMPLE_OutputLog の引数に FString 型の引数 Message を追加しています。
メンバ関数の引数はコンソールコマンドのコマンド引数 になります。

続いて、メンバ関数 SAMPLE_OutputLog の実装を示します。
コマンド引数として受け取った文字列をログに出力するため、UE_LOG マクロを使用しています。

#include "OutputLogConsoleCommand.h"


void UOutputLogConsoleCommandManager::SAMPLE_OutputLog(FString Message)
{
    UE_LOG(LogTemp, Log, TEXT("Message: %s"), *Message);
}

これでコンソールコマンドを定義するための UOutputLogConsoleCommandManager の定義は完了です。

2. CheatManagerの有効化

定義した UOutputLogConsoleCommandManager は、有効にしなければ利用することができません。
UOutputLogConsoleCommandManager を有効化するためには、独自のPlayerControllerを作成してメンバ変数 CheatClassUOutputLogConsoleCommandManager を指定する必要があります。

Bluepirntで実装する場合はPlayerControllerを継承し、DetailsタブのCheat ManagerにあるCheat Classに OutputLogConsoleCommandManager を設定します。

CheatManagerの有効化

C++で実装する場合は、PlayerControllerを継承したクラスのコンストラクタでメンバ変数 CheatClassUOutputLogConsoleCommandManager::StaticClass() を追加します。
ここでは、PlayerControllerを継承したクラスを AOutputLogConsoleCommandPlayerController としています。

AOutputLogConsoleCommandPlayerController::AOutputLogConsoleCommandPlayerController(const FObjectInitializer& ObjectInitializer)
{
    CheatClass = UOutputLogConsoleCommandManager::StaticClass();
}

3. GameModeの作成

作成したPlayerControllerをゲームプレイ中に使用するため、Blueprintで新たなGameMode(ここでは BP_OutputLogConsoleCommandGameMode)を作成してPlayerControllerを OutputLogConsoleCommandPlayerController に設定します。

GameModeの作成

新たに作成したGameModeをレベルに設定します。

GameModeの設定

4. 動作確認

プレイをボタンを押した状態でコンソールを表示し、SAMPLE_OutputLog Hoge と入力します。

コンソールへのコマンド入力

Enterキーを押してコンソールコマンドを実行すると、[Output Log] に LogTemp: Message: Hoge と出力されます。

ログ出力