※この記事で使用しているUnrealのVersionは04.26.0です。

※この記事のサンプルプロジェクトは以下URLにアップされています。

サンプルプロジェクト

皆さんはToolbarにある「MarketPlace」を開けるアイコンを使ったことはあるでしょうか?

おそらくこのアイコンを何度も使ったことがある人は少ないのではないのかと思います。
個人的にはこのアイコンを非表示にできたらいいな~と思うこともしばしばあります。

一応「Editor Preference」内の設定の「General – Appearance」内の「User Interface → Use Small Tool Bar Icons」にチェック入れると、ツールバーのアイコンが小さくなり、その分表示される数が多くなります。

ただ個人的には小さいアイコンは使いづらいなと思うので、今回はこのメニューアイコンを非表示にする方法をメモ程度に紹介します。

使わないメニューを非表示にする方法 レベル【★★★☆】

C++でプロジェクトを作成し、EditorModuleを作成しておきます。
(EditorModuleの作成方法は以下を参照)

[UE4] モジュールについて

build.csは以下のような感じにします。

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class KA_RemoveMenuEditor : ModuleRules
{
	public KA_RemoveMenuEditor(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

		PublicDependencyModuleNames.AddRange
			(new string[] 
			{ 
				"Core",
				"Core",
				"CoreUObject",
				"Engine", 
				"InputCore", 
				"HeadMountedDisplay" ,
				"UnrealEd",
				"KA_RemoveMenu",
				"MainFrame", 
//追加
				"ToolMenus" //追加
			});
	}
}

作成できたら、「BlueprintFunctionLibrary」を継承したクラスを作成します。

作成したEditorModule内にソースを作成します。

FunctionLibrary内には以下のような感じでコードを書きます。

MyBlueprintFunctionLibrary.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"

#include "ToolMenus.h"
#include "IToolMenusModule.h"

#include "MyBlueprintFunctionLibrary.generated.h"

UCLASS()
class KA_REMOVEMENUEDITOR_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
public:
		UFUNCTION(BlueprintCallable)
		static bool RemoveMenu(UToolMenu* InMenuObj, FName InSectionName, FName InBlockName);
	
};

MyBlueprintFunctionLibrary.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyBlueprintFunctionLibrary.h"

bool UMyBlueprintFunctionLibrary::RemoveMenu(UToolMenu* InMenuObj,FName InSectionName,FName InBlockName)
{
	if (!InMenuObj)
	{
		return false;
	}
	
	FToolMenuSection* Section = InMenuObj->FindSection(InSectionName);
	if (!Section)
	{
		return false;
	}

	return 0 < Section->Blocks.RemoveAll([InBlockName](const FToolMenuEntry& Block) { return Block.Name == InBlockName; }) ? true : false;
}

ひとまずこれをビルドして見ます。

Editorが開いたら、「Editor Utility Blueprint 」を作成し、「Editor Utility Object」を親クラスに選択します。

そして下の用な感じでBPを組みます。

これをRunすると、MarketPlaceのアイコンが消えます。

とりあえず消すことはできました。

しかし、Editorを起動する度に毎回実行しなければならないのは面倒です。

なので、Editor起動時に毎回これを実行するようにします。

EditorUtilityBlueprintの「Run」は

エディタの起動時にブループリントを実行する

の方法を使うことで、Editor起動時に実行させることができます。
また、上記方法はUserごとの設定が可能なので、必要に応じて追加・削除が可能です。

Projectフォルダ内の「Config」以下にある「DefaultEditorPerProjectUserSettings.ini」を開いて、以下のように記述します。

[/Script/Blutility.EditorUtilitySubsystem]
StartupObjects=/Game/EUB_RemoveMenu_MarketPlace.EUB_RemoveMenu_MarketPlace

これで、Editor起動時に毎回実行され、MarketPlaceアイコンが非表示になりました。わ~い!!

ちなみに

【UE4】Blueprintだけで、Editor上にメニューを追加する【★★★】

で書いてある、メニュー追加をEditor起動時に実行することで、独自メニューの登録も行えたりもします。

是非EditorMenuのカスタマイズを自分好みに行って、自分だけの扱いやすい環境を整えてみてください!

ちなみに、全部C++でやろうとするとプラスで以下のようなコードを書くかと思います。

KA_RemoveMenuEditor.h(Project名.h)

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"

class FKA_RemoveMenuEditor : public IModuleInterface
{
public:
    virtual void StartupModule() override;
    virtual void ShutdownModule() override;
    void RemoveMarketPlaceMenu(TSharedPtr<SWindow> InRootWindow, bool bIsNewProjectWindow);

    void RemoveMarketPlaceMenu_Impl();


};

KA_RemoveMenuEditor.cpp(Project名.cpp)

// Copyright Epic Games, Inc. All Rights Reserved.

#include "KA_RemoveMenuEditor.h"
#include "Modules/ModuleManager.h"
#include "Interfaces/IMainFrameModule.h"
#include "MyBlueprintFunctionLibrary.h"

#define LOCTEXT_NAMESPACE "KA_RemoveMenuEditor"
 
void FKA_RemoveMenuEditor::StartupModule()
{
	IMainFrameModule& MainFrameModule = IMainFrameModule::Get();
	if (MainFrameModule.IsWindowInitialized())
	{
		RemoveMarketPlaceMenu_Impl();
	}
	else
	{
		MainFrameModule.OnMainFrameCreationFinished().AddRaw(this, &FKA_RemoveMenuEditor::RemoveMarketPlaceMenu);
	}
}

void FKA_RemoveMenuEditor::ShutdownModule()
{
}

void FKA_RemoveMenuEditor::RemoveMarketPlaceMenu(TSharedPtr<SWindow> InRootWindow, bool bIsNewProjectWindow)
{
	RemoveMarketPlaceMenu_Impl();
}

void FKA_RemoveMenuEditor::RemoveMarketPlaceMenu_Impl()
{
	UToolMenu* RemoveToolMenu = UToolMenus::Get()->FindMenu(TEXT("LevelEditor.LevelEditorToolBar"));
	UMyBlueprintFunctionLibrary::RemoveMenu(RemoveToolMenu, TEXT("Content"), TEXT("OpenMarketplace"));
	UToolMenus::Get()->RefreshAllWidgets();
}

#undef LOCTEXT_NAMESPACE

IMPLEMENT_MODULE(FKA_RemoveMenuEditor,KA_RemoveMenuEditor)

説明は省きますが、EditorのWindowが生成されてからメニューをRemoveする処理を実行しないと意味がないので、C++の場合は若干手間がかかります。

以上

※この記事のサンプルプロジェクトは以下URLにアップされています。

サンプルプロジェクト

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です