Happy My Life

日常とか技術とか

設定ファイルのヒミツ

このエントリーはUnreal Engine 4 (UE4) Advent Calendar 2015の19日目です。

今回はいろいろ時間が無かったため、前回の夏コミ(C88)で頒布したUE4の薄い本(Dive to Unreal Engine 4)の補足ネタを書いていきます。久しぶりのUE4エントリーです。

薄い本では既に実装済みだが(試験的実装であるなどの理由により)無効化されている機能を、設定ファイルに設定を追加することによって機能を有効化するというネタを掲載しています。で、今回は、その補足を。なお、今回検証に利用したバージョンは、UE4.10.1 Windows版です。

お約束ですが、設定ファイルを手動で変更した場合のUnrealEditor等の正常動作については保証されません。自己責任で行って下さい。

設定ファイル(.iniファイル)について

設定ファイル(.iniファイル)は、UnrealEditorや実行時の設定が記録されているファイルです。これらは、UnrealEditorなどのソフトが、生成や変更を行います。なので、通常は、開発者が直接編集することはありません。

しかし、どのような設定項目があり、それら設定項目での設定値の意味などを知っていると、まれに役に立ちます。例えば、何かの拍子にこれらの設定ファイルが壊れてしまい、エディタが起動しなくなった場合などがそうです。要はトラブルシューティング的な場合ですね。

では、実際にUE4で利用されている設定ファイルをみていきましょう。UE4のプロジェクトでは個別に設定ファイルが用意されてます。格納されているディレクトリは<project folder>\Configです。設定ファイルは複数あり、概要については次の通りです。ちなみに、.iniファイル自体の書式は、Windowsの一般的な設定ファイルフォーマットであり、内容もテキストであるため、テキストエディタの編集も容易です。

ファイル名 概要
DefaultEditor.ini 設定ファイル
DefaultEditorPerProjectUserSettings.ini 設定ファイル
DefaultEngine.ini UnrealEditor全般の設定
DefaultGame.ini ゲームの設定ファイル
DefaultInput.ini キー入力設定ファイル

ここで、.iniファイルに馴染みがない人向けに書式について簡単に解説します。

ここでは、DefaultEngine.iniファイルの一部をみていきます。

[/Script/EngineSettings.GameMapsSettings]
EditorStartupMap=/Game/FirstPersonBP/Maps/FirstPersonExampleMap

[]で囲まれた文字列は設定のカテゴリーを示しています。 値の設定は、「(Key) = (Value)」の形式で定義しています。先の設定では、EditorStartupMapという変数(Key)に、/Game/FirstPersonBP/Maps/FirstPersonExampleMapという値(Value)を設定します。

先のEditorStartupMap変数は、プロジェクト-マップ&モードでの、EditorStartupMapの項目の内容を保存しています。

ue4-adv1

設定パラメータの意味

このような設定ファイルが他にもあり、設定項目も多数定義されています。では、これらのパラメータには、どのような項目があり、どのような内容が指定可能なのか?をみていきます。

ちなみに、これらの設定ファイルや設定項目は、それらを解説した公式ドキュメントは一切存在しません。そのようなUndocumentedな場合であっても、安心してください。UE4ならば大丈夫です。というのも、ソースコードが公開されているためです。

ということで、ソースコードを探って、設定ファイルのパラメータについて調べていきましょう。ここでは、先ほど登場したEditorStartUpMapを取り上げてみていきます。ソースコードを全文検索する際に"EditorStartupMap"というキーワードで検索すると、いくつかファイルが見つかります。

そのなかでも、ここでは、/Engine/Source/Runtime/EngineSettings/Classes/GameMapsSettings.hファイルを取り上げてみていきます。この.hファイルでは、先のDefaultEngine.iniファイル中の[/Script/EngineSettings.GameMapsSettings]カテゴリーの設定パラメータの入出力を行うクラス(UGameMapsSettingsクラス)を定義しています。

例えば、"EditorStartupMap"については、.hファイルには以下の様に書かれています。

public:

    /** If set, this map will be loaded when the Editor starts up. */
    UPROPERTY(config, EditAnywhere, Category=DefaultMaps)
    FString EditorStartupMap;

このように、コメントなどや型定義を読んでいけば、設定ファイルのパラメータの詳しい情報を知ることができます。このEditorStartupMapは、(さっきの.iniファイルからも分かっては居ましたが)文字列を代入することができ、ここで指定したMAPファイルがEditorの起動時に読み込まれる、といったことがコメントとして書かれています。

この変数EditorStartupMapを通して値にアクセスしているソースコードが、/Engine/Source/Editor/UnrealEd/Private/FileHelpers.cppファイルの3196行目にあるLoadDefaultMapAtStartupメソッドにあります。

void FEditorFileUtils::LoadDefaultMapAtStartup()
{
    FString EditorStartupMap;
    // Last opened map.
    if (GetDefault<UEditorLoadingSavingSettings>()->LoadLevelAtStartup == ELoadLevelAtStartup::LastOpened)
    {
        GConfig->GetString(TEXT("EditorStartup"), TEXT("LastLevel"), EditorStartupMap, GEditorPerProjectIni);
    }
    // Default project map.
    if (EditorStartupMap.IsEmpty()) {
        EditorStartupMap = GetDefault<UGameMapsSettings>()->EditorStartupMap;
    }
    
        ...
}

設定パラメータを読み書きするソースコードは、だいたいこんな風に書かれています。ここでキモになってくるのが、「GConfig」と「GetDefault<(何かの設定クラス)>」です。

隠し設定項目の探し方

で、一歩進めて設定ファイルのクラス(.hファイル)定義と実際に出力された.iniファイルとを照らし合わせていきます。すると「設定ファイルのクラス定義には存在しているが、.iniファイルに出てこない設定項目」や「定義されていないパラメータをGConfig経由で読み込もうとしている」ソースコードが所々に存在することがわかります。このあたりがヒミツの入り口となります。

このあたりの設定を有効化したり、もっと突き詰めて読んでいくと、それまで公にされていなかった機能やメニューが出現したり、利用できたりします。では、それは具体的には何なのか…。は、みなさんへの課題としたいと思います。

個人的には、こういったものを探るのは子供時代に体験した宝探し、ゲームの裏技探しに似ていて、非常にわくわくするんですよね。ソースコードを読む目的ってのは、人それぞれあるでしょうが、宝探し風に読む事もできるんだよ、という話でした。

明日は、@housakusleepingさんです。よろしくお願いします。