プラグインのありなしで挙動を変える実装方法について

お世話になっております。1つ実装方法についてご相談させてください。

現在外部のライブラリをUE4プラグインとして利用しているのですが UEのアップデートにより修正が必要なことが多くその問題が解決するまでそれ以外の部分の動作確認ができなくなる為困っております。

したいこととして該当するプラグインのあり・なしどちらでも エディタを起動して動作確認できる環境を作りたいと思っております。

1例としてライブラリでは次の方法で対応することができました。

  1. プロジェクトの *.Build.cs に「PublicDepencencyModuleNames.Add(“プラグイン名”); PublicDefinitions.Add(“USE_XXX”) 」を定義。プラグインを利用しないときは この2行をコメントアウトする
  2. プラグインのコードを参照しているC++コード(includeや 関数呼び出しなど)を #ifdef USE_XXX ~ #endifで囲む

ただこれはC++でシンプルにプラグインを利用している場合のみ対応可能で以下の状況では対応方法がわかりませんでした。

  • USE_XXXのなかに UCLASS, UFUNCTION, UPROPERTY定義があると コンパイルエラーとなる

    「error : UCLASS inside this preprocessor block will be skipped」

    参考 UProperty wrapped by Marco(#if) doesn't work - Blueprint - Epic Developer Community Forums

  • プラグインで用意されたBlueprintで参照できる要素を利用すると プラグインを導入していないときは存在しないので当然エラーとなる

    (該当部分を削除するのは戻し方がわからなくなるため避けたいです)

最初の対応も適切かどうかまようところがあるため、よい方法がありましたらアドバイスいただけますと大変助かります。よろしくお願いします。

お世話になっております。

USE_XXXのなかに UCLASS, UFUNCTION, UPROPERTY定義があると コンパイルエラーとなる

参考にされたリンクでSteaveが述べていますようにUHTで認識可能なプリプロセッサに制約があるため、該当するPropertyのエラーは解決できません。よってこのルールを前提に定義を考慮して設計して頂く必要がございます。

プラグインで用意されたBlueprintで参照できる要素を利用すると プラグインを導入していないときは存在しないので当然エラーとなる

残念ながらこちらも回避できないエラーです。BlueprintNodeのT3Dデータにあるpluginのスクリプトまでのリンクを元に構築しているため、pluginオフの状態となっている場合はリンクからの読み込み出来ないためエラーとなります。pluginで定義されたモジュールを呼ぶためのラップ関数をC++側で用意してその中でpluginが定義されていない時(USE_XXXがoffなど)は無効時の処理をするように定義することでBlueprintでのエラーは回避できますが、全てのラッパーを用意する必要があり、呼び出しコストも増えるので、この方法はあまり効率的ではないですが…。

最初の対応も適切かどうかまようところがあるため、よい方法がありましたらアドバイスいただけますと大変助かります。
最初に記述頂いたPublicDefinitions.Addで定義を追加する方法は、Engine側でも同じような方法を利用していますので適切なように思います。実際には定義の0/1を切り替えるだけなので殆ど同じです。
よろしくお願いします。

仕様について理解いたしました。不明点がクリアになりました。
運用しやすい方法を検討してみます。

ありがとうございました。