UE4 – 使用C ++扩展编辑器小工具

Posted on

原文链接: https://isaratech.com/ue4-c-editor-utility-widgets-4-22/ (英文)
译者:李华宾

上一篇文章(UE4 – UMG编辑器小工具简介

上一篇文章中,我们介绍了UMG Editor Widgets,自从虚幻引擎4.22开始,它允许用户使用UMG设计器定义编辑器小工具。

在本文中,我们将介绍UMG编辑器小部件的扩展用法,但使用的是C ++。当然,在4.22之前已经可以使用C ++定义编辑器小工具,但是这个新版本增加了新的可能性。例如,我们现在可以从C ++定义一个Editor Widget类,并使用Editor Utility Widget Blueprint对其进行扩展。这使我们在使用UMG设计器时最终可以从C ++中受益,在扩展引擎方面提供极大的自由度。

EditorUtilityWidget类和插件创建

如果我们将光标放在上次创建的Editor Widget上,我们可以注意到资产的父类是EditorUtilityWidget类。这个类将是我们从C ++定义Editor Widget的基类。问题是还没有很多资料解释如何与这个类进行交互,所以可能需要一些逆向工程来理解如何使用它的功能。
官方文档可以在这里找到。要查找类的源代码或公开的函数,我们可以转到引擎源的文件夹Editor / Blutility。

首先,我们需要新创建一个插件。实际上,EditorUtilityWidget functionnality是只能在编辑器里使用,所以它必须被包在一个«Editor»插件中。
为此,我们将进入设置>插件 并点击 新插件… 我们可以选择一个空白插件。我们只需编辑uplugin文件并将模块类型设置为«Editor»而不是«Runtime»,在.build.cs文件中我们将添加«UnrealEd»,«UMG»和«Blutility»到PrivateDependencyModuleNames 列表中。

为了以防万一,您还可以在Epic的wiki上阅读以下教程:https//wiki.unrealengine.com/Creating_an_Editor_Module

在我的例子中,我创建了一个名为CppEditorWidget的插件,我有以下文件。

.uplugin 文件:


{
	"FileVersion": 3,
	"Version": 1,
	"VersionName": "1.0",
	"FriendlyName": "CppEditorWidget",
	"Description": "",
	"Category": "Other",
	"CreatedBy": "",
	"CreatedByURL": "",
	"DocsURL": "",
	"MarketplaceURL": "",
	"SupportURL": "",
	"CanContainContent": true,
	"IsBetaVersion": false,
	"Installed": false,
	"Modules": [
	{
		"Name": "CppEditorWidget",
		"Type": "Editor",
		"LoadingPhase": "PostEngineInit"
	}
	]
}

.build.cs 文件:

using UnrealBuildTool;

public class CppEditorWidget : ModuleRules
{
	public CppEditorWidget(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
		
		PublicIncludePaths.AddRange(
			new string[] {
				// ... add public include paths required here ...
			}
			);
				
		
		PrivateIncludePaths.AddRange(
			new string[] {
				// ... add other private include paths required here ...
			}
			);
			
		
		PublicDependencyModuleNames.AddRange(
			new string[]
			{
				"Core",
				// ... add other public dependencies that you statically link with here ...
			}
			);
			
		
		PrivateDependencyModuleNames.AddRange(
			new string[]
			{
				"CoreUObject",
				"Engine",
				"Slate",
				"SlateCore",
                "UnrealEd",
                "Blutility",
                "UMG"
				// ... add private dependencies that you statically link with here ...	
			}
			);
		
		
		DynamicallyLoadedModuleNames.AddRange(
			new string[]
			{
				// ... add any modules that your module loads dynamically here ...
			}
			);
	}
}

该类的C ++代码

如前所述,我们需要扩展EditorUtilityWidget类。以下是我们需要的:

MyEditorWidgetClass.h:


#pragma once

#include "CoreMinimal.h"
#include "Editor/Blutility/Classes/EditorUtilityWidget.h"

#include "MyEditorWidgetClass.generated.h"

/**
 *
 */
UCLASS(BlueprintType)
class CPPEDITORWIDGET_API UMyEditorWidgetClass : public UEditorUtilityWidget
{
	GENERATED_BODY()

public:
	UMyEditorWidgetClass();
	~UMyEditorWidgetClass();

	UFUNCTION(BlueprintCallable)
		void Hello();
};

MyEditorWidgetClass.cpp:


#include "MyEditorWidgetClass.h"

#define DEBUG_MSG(x, ...) if(GEngine){GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, FString::Printf(TEXT(x), __VA_ARGS__));}

UMyEditorWidgetClass::UMyEditorWidgetClass()
{
}

UMyEditorWidgetClass::~UMyEditorWidgetClass()
{
}

void UMyEditorWidgetClass::Hello()
{
	DEBUG_MSG("Hello")
}

我们在这里只是创建了一个带有函数的类,它在屏幕上打印“Hello”作为调试消息。但我们可以重写构造函数,或添加更复杂的函数。

如果你在参考当前教程实践的时候遇到了困难,可以在此处下载整个插件:

CppEditorWidget

只需在项目文件夹中创建«Plugins»文件夹,然后在文件夹下解压即可。

通过蓝图使用新创建的类

首先,我们将创建一个新的Editor Widget Utility Blueprint 蓝图类,就像我们在第一个教程中所做的那样,然后打开它。
之后,我们进入事件图表,这样我们可以在编辑的类设置中更改父类。通过将蓝图的父类设置成我们之前创建的C ++类,我们就可以在蓝图中调用在C ++类中定义好的的C ++函数了。

结论

显然,这个例子很简单:我们并没有真正充分发挥C ++功能的潜力,但是我们正在展示如何做到这一点。如果您熟悉UE4 C ++,您现在应该能够看到如何从Editor Widget调用C ++函数。在下一篇文章中,我们将看到有关它的更多细节,我们将重点介绍如何从C ++编辑和控制窗口小部件。如果您希望在下一篇文章发布时得到通知,您可以在TwitterFacebook上关注我们。

下一篇文章(UE4 – 使用C ++控制编辑器小部件(4.22))

2 Replies to “UE4 – 使用C ++扩展编辑器小工具”

发表评论

电子邮件地址不会被公开。 必填项已用*标注