main() blog

プログラムやゲーム、旅、愛する家族について綴っていきます。

【UE5】コンソール変数を使ってみよう!

概要

コンソール変数の使用方法についてです。
コンソールコマンドから定義したコマンドで変数の値を変更することができます。
コンソール変数で使用できる型としてはint、float、bool、FStringを使用することができます。

グラフィックの設定やデバッグ用の変数などとして使用することができます。
あくまでも変数の値の変更のみを行うことができます。

呼び出し時や変更時にコマンドして処理を行いたい場合はコンソールコマンドの実装方法で行う必要があります。
こちらについては過去記事を参考にしていただければと思います。

www.main-function.com

※本記事はC++での開発を前提としています。

動作環境

UnrealEngine 5.4.4

実装

変数定義

コンソール変数を実装するにはいくつか方法があります。

変数を定義する方法、ランタイムで追加する方法があります。
変数を定義する方法はstatic変数で定義することでエンジンの生成前に変数の生成を行うことができます。
TAutoConsoleVariable<>を使用してテンプレートで型を指定する方法と、FAutoConsoleVariableRef を使用して既存の変数を登録することも可能です。
UEのドキュメントではFAutoConsoleVariableRefは使用しないことを推奨とのことです。

以下がTAutoConsoleVariable<>での宣言のサンプルです。
参照時に変数をexternなどで参照できるようにもできますが、ヘッダーなどをインクルードする、もしくはexternをcppに記述してく必要が出てきます。
今回はstaticで宣言もしくは無名のnamespaceでローカルスコープで宣言して定義してみたいと思います。

namespace
{

TAutoConsoleVariable<int> CVarTestIntValue(
    TEXT("TestIntValue"),
    0,
    TEXT("Test int value."),
    ECVF_Default
);

TAutoConsoleVariable<float> CVarTestFloatValue(
    TEXT("TestFloatValue"),
    0.0f,
    TEXT("Test float value."),
    ECVF_Default
);

TAutoConsoleVariable<bool> CVarTestBoolValue(
    TEXT("TestBoolValue"),
    false,
    TEXT("Test bool value."),
    ECVF_Default
);

TAutoConsoleVariable<FString> CVarTestStringValue(
    TEXT("TestStringValue"),
    TEXT(""),
    TEXT("Test string value."),
    ECVF_Default
);

}

ちなみにFAutoConsoleVariableRefで宣言する場合は以下の様になります。
それぞれの変数を用意して、引数で渡すことでその変数をコマンドで変更できるようになります。

namespace
{
int32 TestIntValue = 0;
FAutoConsoleVariableRef CVarTestIntValue(
    TEXT("TestIntValue"),
    TestIntValue,
    TEXT("Test int value."),
    ECVF_Default);

float TestFloatValue = 0.0f;
FAutoConsoleVariableRef CVarTestFloatValue(
    TEXT("TestFloatValue"),
    TestFloatValue,
    TEXT("Test float value."),
    ECVF_Default);

bool TestBoolValue = false;
FAutoConsoleVariableRef CVarTestBoolValue(
    TEXT("TestBoolValue"),
    TestBoolValue,
    TEXT("Test bool value."),
    ECVF_Default);

FString TestStringValue = TEXT("");
FAutoConsoleVariableRef CVarTestStringValue(
    TEXT("TestStringValue"),
    TestStringValue,
    TEXT("Test string value."),
    ECVF_Default);
}

実行

コンソールコマンドからコマンド名が認識されていることが確認できます。

引数無しで実行した場合、現在設定されている値と変更の履歴が確認できます。
ログにはコンストラクタで設定されたことが確認できます。

引数で値を渡すことで変更することができます。

引数無しで再度確認すると値が変更されたことが確認できます。
変更履歴としてコンソールからの変更ということも確認できます。

boolの変数の場合はtrue/falseで設定できます。
True/Flaseでも設定することができるようです。
数値の場合は0だとfalse、それ以外ですとtrueが設定されるようです。

FStringの変数の場合は文字列がそのまま設定されます。

C++での値の取得と設定

少し煩雑ではありますが、コマンド名で参照して使用する方法で説明します。

コマンド名からコンソール変数を取得して操作することができます。
毎回参照するケースなどではstatic constなどで保持して参照するなどの対応を検討してください。

void hoge()
{
    IConsoleVariable* variable = IConsoleManager::Get().FindConsoleVariable(TEXT("TestIntValue"));
    if (variable)
    {
        UE_LOG(LogTemp, Log, TEXT("TestIntValue: %d"), variable->GetInt());
    }
}

ログに取得した値が出力されていることが確認できます。

同様に値の設定、変更もできます。

void hoge()
{
    IConsoleVariable* variable = IConsoleManager::Get().FindConsoleVariable(TEXT("TestIntValue"));
    if (variable)
    {
        variable->Set(1000);

        UE_LOG(LogTemp, Log, TEXT("TestIntValue: %d"), variable->GetInt());
    }
}

コンソールコマンドで変更を確認します。
履歴を確認するとコードから変更されたことも確認できます。

ReadOnly

変数の宣言時の引数のフラグでReadOnlyを指定するとコンソールコマンドからランタイムでは変更できなくなります。
C++からの設定か、iniファイルでの設定で変更することができるようです。

TAutoConsoleVariable<int> CVarTestIntValue(
    TEXT("TestIntValue"),
    0,
    TEXT("Test int value."),
    ECVF_ReadOnly
);

コンソールコマンドから変更しようとするとread onlyのメッセージが表示され、変更されていないことが確認できます。

iniファイルでの設定

DefaultEngine.iniでコンソール変数の初期値を変更してみたいと思います。
ReadOnlyの属性でも変更することが可能とのことです。

[ConsoleVariables]
TestIntValue=100

ReadOnltyの属性でも実行後にコンソールコマンドで初期値が100に変更されていることが確認できます。

参考

Unreal Engine の C++ のコンソール変数 | Unreal Engine 5.5 ドキュメンテーション | Epic Developer Community