Unreal Engineではゲームプレイ中、コンソールコマンドを利用することによってゲームの挙動をプレイ中に変更できます。
コンソールコマンドはゲームプレイ中の任意のタイミングで実行できるため、特にデバッグ用途で有効です。
いくつかの便利なコンソールコマンドが初期状態で定義されていますが、独自のコンソールコマンドを定義することも可能になっています。
独自のコンソールコマンドを定義することで、開発中のゲームに特化した処理を任意のタイミングで実行できるようになります。
本記事では、CheatManagerを使ってコンソールコマンドを定義する方法について説明します。
コンソールコマンドとは
コンソールコマンドは、レベルエディタビューポート上でキー “` を押すと表示されるコンソールから実行できるコマンドです。
ただし “` はキーボード配列によっては入力できないため、[Project Settings] の [Input] > [Console] > [Console Keys] から適当なキーを追加する必要があります。
いくつかのコンソールコマンドが標準で提供され、コンソールから実行できます。
例えばStatコマンドは、各処理に対してCPUや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.h
に UCheatManager
として定義されています。
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を作成してメンバ変数 CheatClass
に UOutputLogConsoleCommandManager
を指定する必要があります。
Bluepirntで実装する場合はPlayerControllerを継承し、DetailsタブのCheat ManagerにあるCheat Classに OutputLogConsoleCommandManager
を設定します。
C++で実装する場合は、PlayerControllerを継承したクラスのコンストラクタでメンバ変数 CheatClass
に UOutputLogConsoleCommandManager::StaticClass()
を追加します。
ここでは、PlayerControllerを継承したクラスを AOutputLogConsoleCommandPlayerController
としています。
AOutputLogConsoleCommandPlayerController::AOutputLogConsoleCommandPlayerController(const FObjectInitializer& ObjectInitializer)
{
CheatClass = UOutputLogConsoleCommandManager::StaticClass();
}
3. GameModeの作成
作成したPlayerControllerをゲームプレイ中に使用するため、Blueprintで新たなGameMode(ここでは BP_OutputLogConsoleCommandGameMode
)を作成してPlayerControllerを OutputLogConsoleCommandPlayerController
に設定します。
新たに作成したGameModeをレベルに設定します。
4. 動作確認
プレイをボタンを押した状態でコンソールを表示し、SAMPLE_OutputLog Hoge
と入力します。
Enterキーを押してコンソールコマンドを実行すると、[Output Log] に LogTemp: Message: Hoge
と出力されます。