1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Build.csからプロジェクトのディレクトリパスを取得する

Last updated at Posted at 2022-07-17

はじめに

プラグインのBuild.csでSourceフォルダ以下のThirdPartyフォルダに外部のライブラリのファイルをコピーする場合などでModuleDirectoryを使ったり、エンジンモジュールのPrivateフォルダにあるヘッダーをインクルードするためにEngineDirectoryを使ったりすると思いますが、今回は起動中のプロジェクトのディレクトリパスを取得する方法をご紹介します。

ModuleDirectory
How To link library in Build.cs correctly?

EngineDirecotry
How to access a file in private folder in module

やり方

ProjectDirectory.Build.cs
private string ProjectDirectory
{
	get
	{
		foreach (var CommandLineArg in Environment.GetCommandLineArgs())
		{
			var NameAndValues = new List<string>(CommandLineArg.Split('=', StringSplitOptions.RemoveEmptyEntries));
			if (NameAndValues.Count < 2)
			{
				continue;
			}
			if (NameAndValues[0] != "-Project")
			{
				continue;
			}
			NameAndValues.RemoveAt(0);
			var UProjectFilePath = string.Join("", NameAndValues.ToArray());
			return Path.GetDirectoryName(UProjectFilePath);
		}

		return null;
	}
}

Build.csはUnrealBuildTool(以降UBT)から実行されるため、UBTに渡されたコマンドライン引数からuprojectファイルのパスを取得することができます。
コマンドライン引数は以下のような感じです。

[EngineRoot]\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll [ModuleName] Win64 Development -Project=[FullPathToProject].uproject -WaitMutex -FromMsBuild

コマンドライン引数をパースするにあたって、パーサーとしてSystem.CommandLineを使用するか、正規表現でパスを抽出するためにSystem.Text.RegularExpressions.Regexを使用したかったのですが、どちらもnugetを使用する必要があったりと何かしら行う必要があったため、コピペしただけで動くものとしては上記のものになりました。

もっと簡単に

もっと簡単にプロジェクトファイルのパスを取得する方法を見つけたので追記します。

ProjectDirectory.Build.cs
private string ProjectDirectory
{
    get
    {
        if (Target.ProjectFile != null)
        {
            return Path.GetDirectoryName(Target.ProjectFile.FullName);
        }

        return null;
    }
}

Target.ProjectFileからプロジェクトファイルの名前やパスなどが取得できるようです。
この変数はnull許容値型なので、何かしらの条件下では値が空になる可能性がありそうです。
プラグインのBuild.csで使用する想定でプロジェクト、エンジンどちらのPluginsフォルダ以下に配置してもプロジェクトのファイルの情報が入っていました。

おわりに

ちなみにはじめにで紹介したプロパティとは別でPluginDirectoryというものがあり、こちらを使うとBuild.csがあるSourceフォルダのパスではなくupluginがあるフォルダのパスを取得できるため、ModuleDirectoryの代わりにこちらを使ったほうがよさそうです。
プロパティ名からわかりますが、プラグイン以外のBuild.csでPluginDirectoryを使用するとエラーが発生します。
ちょっとプロジェクトのディレクトリパスを取得しようと思ったら以外と面倒だったので、今後同じことをやる方の助けになれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?