配布したいUEプラグインのソースコードを非公開にする
1. 背景
Unreal Engine プラグイン "AwesomePlugin" を開発用のプロジェクト "UEProject" で開発しているとします。このプラグインは Binaries 下に格納したサードパーティーライブラリの機能を利用していて、Source 下のソースコードで DLL を読み込んで関数を実行する API を実装してあります。
次のツリーでいうと、Awesome.dll がサードパーティーライブラリです。APIは、AwesomeAPI.cpp にそういうクラスを実装してあると考えてください。
UEProject/
└── Plugins/
└── AwesomePlugin/
├── Binaries/
│ └── ThirdParty/
│ └── Win64/
│ └── Awesome.dll // サードパーティーライブラリ
└── Source/
├── Private/
│ ├── AwesomeMain.cpp
│ ├── AwesomeAPI.cpp // API
│ └── AwesomeAPI.h
├── Public/
│ └── AwesomeMain.h
└── AwesomePlugin.Build.cs
ある時、このプラグインをサンプルプロジェクトに組み込んで配布したいと考えました。しかし、ある理由から DLL の公開関数の機密性を守る必要があり、関数名が書いてある API のソースコードを公開したくありません。
そこで調査した結果、次の手順でプラグインが動作することがわかりました。
2. 手順
2.1 プラグインをパッケージする
- プロジェクトを開く
- Plugins ウィンドウを開く
- 目的のプラグイン(ここでは AwesomePlugin)を開き、"Package" をクリック
- パッケージの出力先を指定して実行する
これを実行するとプラグインのモジュールがコンパイルされます。まずこれが重要です。
2.2 プリコンパイルの使用を有効化する
上のツリーのようにコンパイル結果を含んでいないプラグインをプロジェクトの Plugins フォルダにコピーしてプロジェクトを開くと、まず Unreal Build Tool が未コンパイルのプラグインのモジュールを探してコンパイルを始めます。つまり、モジュールのコンパイル結果の入っていないプラグインを利用するためには、ソースコードを含んでいる必要があるということになります。
では、先ほどの 2.1 で得られたコンパイル結果さえあればソースコードは不要かというと、このままではいけません。そこで、Unreal Build Tools がプラグインに含まれるモジュールのひとつひとつをコンパイルする時に、「このモジュールはプリコンパイル(事前コンパイル)を使ってください」と教えるオプションを有効にします。
- プラグインの各モジュールで
bUsePrecompile
オプションを有効化する
using UnrealBuildTool;
using System.Collections.Generic;
public class AwesomePluginModule : ModuleRules
{
public AwesomePluginModule(ReadOnlyTargetRules Target) : base(Target)
{
// プリコンパイル使用の有効化
bUsePrecompile = true;
}
}
Build.cs の参考にしたドキュメント:https://dev.epicgames.com/documentation/ja-jp/unreal-engine/module-properties-in-unreal-engine?application_version=5.3
書いたら保存しましょう。これで、AwesomePlugin モジュールはプリコンパイルが使用されるようになります。手順としてはここまでなのですが、ソースコードなしで動作するかどうか検証してみましょう。
2.3 ソースコードを削除してプロジェクトで確認する
- Private と Public の中身を削除する(.cpp と .h)
- 新規プロジェクトを作成して Editor が開いたら一旦終了する
- プロジェクトのルートフォルダに Plugins フォルダを作成する
- 2.2 まで実行したプラグインを Plugins フォルダにコピーする
- プロジェクトを開いてプラグインが有効化されていることを確認する
エラーなくプロジェクトが開いて、プラグインが機能することを確認してください。
3. おわりに
以降はコンパイルせずともプラグインが利用できるので、プラグインを使いたいプロジェクトに使い回すことができます。
4. 参考
こちらのフォーラム書き込みを参考にしました。
Discussion