IntroTutorialsプラグインを参考に、自作のプラグインによるメニューの拡張を試みました。
下記のコードで実装には成功したのですが、モジュールのUnload後にWindowメニューを開こうとすると、エディタがクラッシュするという問題が発生しました。
#include "MyPluginPrivatePCH.h"
class FMyPlugin : public IMyPlugin
{
virtual void StartupModule() OVERRIDE;
virtual void ShutdownModule() OVERRIDE;
void WindowMenuExtension(FMenuBuilder& MenuBuilder);
TSharedPtr<FExtender> Extender;
};
IMPLEMENT_MODULE( FMyPlugin, MyPlugin )
void FMyPlugin::StartupModule()
{
Extender = MakeShareable(new FExtender);
Extender->AddMenuExtension("WindowLocalTabSpawners", EExtensionHook::After, NULL, FMenuExtensionDelegate::CreateRaw(this, &FMyPlugin::WindowMenuExtension));
FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(Extender);
}
void FMyPlugin::ShutdownModule()
{
if (Extender.IsValid() && FModuleManager::Get().IsModuleLoaded("LevelEditor"))
{
FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
LevelEditorModule.GetMenuExtensibilityManager()->RemoveExtender(Extender);
}
}
void FMyPlugin::WindowMenuExtension(FMenuBuilder& MenuBuilder)
{
//...
}
おそらく、FExtensibilityManager::AddExtender() で登録されたFExtenderに保持されたDelegateが、FExtensibilityManager::GetAllExtenders()呼び出し時に複製されて外部で保持されており、FExtensibilityManager::RemoveExtender()呼び出し以降にも削除されておらず、解放後のモジュールに対してDelegateの呼び出しを行おうとしているものと思われます。
実害としては開発時に毎回エディタを再起動しなければいけないくらいで、緊急性は低いかと思いますが、調査・対応して頂ければと思います。
また、現在のバージョン4.1環境でこの問題を回避する方法があれば、ご教示頂ければと思います。
以上、よろしくお願い致します。