タイトルそのままですが、流れをサクッと確認したい人はとりあえず動画でどうぞ!
作成手順
※プラグイン名は仮にmyPluginとし、以降それに関連した命名規則によるものとなる。
※プロジェクト名とプラグイン名が同名だとプラグインが作成出来ないので注意。
Unreal
-
プロジェクト作成(テンプレートは適当に) / プロジェクトのデフォルト : C++
-
メニュー > 編集 > プラグイン > 追加 > エディタツールバーボタン > プラグイン名入力 > プラグイン作成
メニューバーにアイコンが追加されクリックでWindowが開く。 -
EUWをプラグインに含めるようにする
メニュー > 編集 > プラグイン > Other > myPlugin > 編集 > Can Contain Content : True
再起動するとコンテンツブラウザからPlugins/myPluginコンテンツフォルダが追加されてるのが確認出来る。 -
myPluginコンテンツ内にEUWを作成
VisualStudio
プロジェクト作成時にVisualStudioが起動するのでこのタイミングで再読み込みを行い変更を反映させる。
※作業ディレクトリ: Unreal Projects\plugin_test\Plugins\test\Source\myPlugin
各ファイルを以下のように変更する。
※+ は書き込まないように
myPluginBuild.cs
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
+ "EditorScriptingUtilities"
// ... add other public dependencies that you statically link with here ...
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
"Projects",
"InputCore",
"EditorFramework",
"UnrealEd",
"ToolMenus",
"CoreUObject",
"Engine",
"Slate",
"SlateCore",
+ "UMGEditor",
+ "Blutility",
+ "UMG"
// ... add private dependencies that you statically link with here ...
}
);
Public\myPlugin.h
class FmyPluginModule : public IModuleInterface
{
public:
/** IModuleInterface implementation */
virtual void StartupModule() override;
virtual void ShutdownModule() override;
+ virtual ~FmyPluginModule() {}
/** This function will be bound to Command. */
void PluginButtonClicked();
private:
void RegisterMenus();
+ void RunEditorUtilityWidget();
private:
TSharedPtr<class FUICommandList> PluginCommands;
};
Private\myPlugin.cpp
※ここでエラーが出ても後で解決するので気にしない。
#include "myPlugin.h"
#include "myPluginStyle.h"
#include "myPluginCommands.h"
#include "Misc/MessageDialog.h"
#include "ToolMenus.h"
+ #include "EditorAssetLibrary.h"
+ #include "Editor/Blutility/Public/EditorUtilitySubsystem.h"
+ #include "Editor/Blutility/Classes/EditorUtilityWidgetBlueprint.h"
+ #include "Editor/Blutility/Classes/EditorUtilityWidget.h"
void FmyPluginModule::PluginButtonClicked()
{
// Put your "OnButtonClicked" stuff here
- FText DialogText = FText::Format(
- LOCTEXT("PluginButtonDialogText", "Add code to {0} in {1} to override this button's actions"),
- FText::FromString(TEXT("FtestModule::PluginButtonClicked()")),
- FText::FromString(TEXT("test.cpp"))
- );
- FMessageDialog::Open(EAppMsgType::Ok, DialogText);
+ RunEditorUtilityWidget();
}
以下を追加
void FmyPluginModule::RunEditorUtilityWidget()
{
UObject* Blueprint = UEditorAssetLibrary::LoadAsset(FString(TEXT("EUW_Path")));
if (Blueprint)
{
UEditorUtilityWidgetBlueprint* EditorWidget =
Cast<UEditorUtilityWidgetBlueprint>(Blueprint);
if (EditorWidget)
{
UEditorUtilitySubsystem* EditorUtilitySubsystem =
GEditor->GetEditorSubsystem<UEditorUtilitySubsystem>();
EditorUtilitySubsystem->SpawnAndRegisterTab(EditorWidget);
}
}
}
EUW_PathにはUnrealのコンテンツブラウザからEUWのリファレンスをコピーして置換
Pluginのビルドとパッケージ
- Unrealを閉じる
- .uprojectを右クリックから Genalate Visual Studio project files
- VisualStudioで 再読み込み > myPluginのビルド
- .uprojectを開き先ほど追加されたアイコンをクリックするとEUWが開く
- メニュー > 編集 > プラグイン > Other > myPlugin > 編集 > 依存関係 > Plugins に EditorScriptingUtilities を追加
- メニュー > 編集 > プラグイン > other > myPlugin > パッケージ
以上
あとがき
EUWで色々作ってたら他のプロジェクトで使うときにプラグイン化した方が楽なのでは?と思ったけど、ユーザビリティー的にPluginコンテンツまで行ってEUW開かせたりするのはよろしくないと思ってメインツールバーにアイコン表示させてそこから開かせるかたちに。
C++までは触りたくないいわゆるクリエーター的な立場だとEUWあたりで済ませたいんだけどこのあたりになるとやはりC++に手を出さないといけなくなるなぁ。
なかなかこの辺の参考になるものがなかったので備忘録的にまとめてみました。
(C++とかまったく触らないのでおかしいところ多々あるかも…)