0
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?

UnrealEngineで特定のプラグインを使用していたら定数を定義してC++で利用できるようにする

Posted at

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++のコードを書きたい場合には良さそうな気がします。

0
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
0
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?