UnrealEngineのプロジェクトのbuild.csで特定のプラグインが有効な場合に定数を定義してC++で利用してみたのでその内容を記録しておきます。
参照サイト
以下のサイトにあるように、uprojectのJSONファイルをパースしてプラグイン情報を取得してプラグインが有効になっているか判断しています。
試した環境
UE5.3.2
試した内容
以下のようにプロジェクトのbuild.csに追記しました。
using EpicGames.Coreの実体は、UnrealEngineソースのEngine/Source/Programs/Shared/EpicGames.Coreの中みたいでJSONパーサーなどのクラスが用意されているようです。
build.cs
using System.Runtime.CompilerServices;
using UnrealBuildTool;
using EpicGames.Core; // <= 追加
using System;
public class CppBuildCsJsonTest : ModuleRules
{
public CppBuildCsJsonTest(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PrivateDependencyModuleNames.AddRange(new string[] { });
Configure(Target); // <= 追加
}
// 追加
private void Configure(ReadOnlyTargetRules Target)
{
JsonObject RootObject;
if (!JsonObject.TryRead(Target.ProjectFile, out RootObject))
{
throw new Exception(string.Format("{0} is not found", Target.ProjectFile.FullName));
}
JsonObject[] PluginObjects;
if (!RootObject.TryGetObjectArrayField("Plugins", out PluginObjects))
{
return;
}
foreach (JsonObject PluginObject in PluginObjects)
{
string PluginName;
PluginObject.TryGetStringField("Name", out PluginName);
bool PluginEnabled;
PluginObject.TryGetBoolField("Enabled", out PluginEnabled);
if (PluginName == "OpenXR" && PluginEnabled)
{
PublicDefinitions.Add("OPENXR_ENABLED=1");
}
}
}
}
以下のようなC++コードを用意しておくとプラグインが有効か判定できます。
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "MyUtils.generated.h"
UCLASS()
class CPPBUILDCSJSONTEST_API UMyUtils : public UObject
{
GENERATED_BODY()
UFUNCTION(BlueprintPure)
static bool IsEnabledOpenXR()
{
#ifdef OPENXR_ENABLED
return true;
#else
return false;
#endif
}
};
ただし、プラグインを有効・無効にしただけでは即座に反映されません。
プラグインの有効・無効を変更した後にVisualStudioでプロジェクトをビルドする必要があります。
単純にプラグインが有効化どうか判定するだけならもっと別の方法が良さそうですが、プラグインが有効な場合に依存する処理をして有効でない場合はしないといったC++のコードを書きたい場合には良さそうな気がします。