はじめに
プラグインの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
やり方
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を使用する必要があったりと何かしら行う必要があったため、コピペしただけで動くものとしては上記のものになりました。
もっと簡単に
もっと簡単にプロジェクトファイルのパスを取得する方法を見つけたので追記します。
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を使用するとエラーが発生します。
ちょっとプロジェクトのディレクトリパスを取得しようと思ったら以外と面倒だったので、今後同じことをやる方の助けになれば幸いです。