IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 学习在虚幻引擎中使用UMG作为编辑器控件 -> 正文阅读

[游戏开发]学习在虚幻引擎中使用UMG作为编辑器控件

目标

上一篇《学习虚幻引擎UMG的基础》中已经对UMG的基础有些了解了。

本篇目标是,学习使用UMG作为编辑器控件(之前往往是使用Slate做编辑器控件),然后对一些感兴趣的地方进行观察和实验。

1. 试用基础功能

正如官方文档所展示的,其功能的使用很简单。

首先创建一个 Editor Utility Widget 型蓝图。
在这里插入图片描述
然后正常编辑UMG
在这里插入图片描述
然后,右键这个蓝图点击 Run Editor Utility Widget
在这里插入图片描述
即可显示界面:
在这里插入图片描述
同时也可以发现它注册了一个能打开窗口的菜单:
在这里插入图片描述

2. 观察继承关系

正如《学习虚幻引擎UMG的基础》中提到的。每个蓝图不仅有作为蓝图资源的继承关系,也有它新定义的一个类的继承关系。

比如这里创建的蓝图,它的蓝图类是UEditorUtilityWidgetBlueprint

可以通过 Copy Reference 获得引用字符串。
在这里插入图片描述
字符串显示:
EditorUtilityWidgetBlueprint’/Game/yaksueEditorUtilityWidgetBlueprint.yaksueEditorUtilityWidgetBlueprint’
因此类型是EditorUtilityWidgetBlueprint

\Engine\Source\Editor\Blutility\Classes\EditorUtilityWidgetBlueprint.h 可看到它的继承关系,是一种更特殊的UMG蓝图类

UEditorUtilityWidgetBlueprint
UWidgetBlueprint
UBaseWidgetBlueprint
UBlueprint
UBlueprintCore
UObject

而这个蓝图新定义的类继承自UEditorUtilityWidget
\Engine\Source\Editor\Blutility\Classes\EditorUtilityWidget.h 中可看到它也是一种更特殊的UMG类

UEditorUtilityWidget
UUserWidget
UWidget
UVisual
UObject

3. 尝试用C++代码调用UMG内容作为控件

UEditorUtilityWidgetBlueprint中,可以看到一个关键的函数是CreateUtilityWidget,因为这个函数负责将UMG控件转换为了Slate控件。
在这里插入图片描述
接下来,我想在C++中通过这个接口来调用它,因为这样我就可以用C++控制这个UMG出现在编辑器中的位置与时机了。
但是注意: 这个类或这个函数并没有加XXX_API的宏,因此(在不改变引擎代码的情况下)不能在模块外调用。所以,只能参考这个函数中的代码在外部写一个类似的了。


Editor Standalone Window为模板创建插件。
在这里插入图片描述
之所以用这个模板是因为它提供了一个按钮,点击就会创建一个窗口,而要想改变窗口中的内容就需要改变这里:
在这里插入图片描述
内容改变为:

TSharedRef<SDockTab> FTestCallUMGModule::OnSpawnPluginTab(const FSpawnTabArgs& SpawnTabArgs)
{
	//加载UMG的BP
	UBlueprint* UMGBP = LoadObject<UBlueprint>(nullptr, L"/Game/yaksueEditorUtilityWidgetBlueprint");

	//仿照 UEditorUtilityWidgetBlueprint::CreateUtilityWidget() 再实现一遍
	TSharedRef<SWidget> TabWidget = SNullWidget::NullWidget;
	{
		UEditorUtilityWidget* CreatedUMGWidget = nullptr;//创建的UMG控件

		UClass* BlueprintClass = UMGBP->GeneratedClass;
		TSubclassOf<UEditorUtilityWidget> WidgetClass = BlueprintClass;
		UWorld* World = GEditor->GetEditorWorldContext().World();
		if (World)
		{
			if (CreatedUMGWidget)
			{
				CreatedUMGWidget->Rename(nullptr, GetTransientPackage());
			}
			CreatedUMGWidget = CreateWidget<UEditorUtilityWidget>(World, WidgetClass);
		}
		if (CreatedUMGWidget)
		{
			TabWidget = SNew(SVerticalBox)
				+ SVerticalBox::Slot()
				.HAlign(HAlign_Fill)
				[
					CreatedUMGWidget->TakeWidget()
				];
		}
	}

	return SNew(SDockTab)
		.TabRole(ETabRole::NomadTab)
		[
			// Put your tab content here!
			TabWidget
		];
}

为了让代码认识UEditorUtilityWidget需要补上include:

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

为了让一些函数的实现能找到需要补上 “UMGEditor”,“Blutility”,“UMG” 这三个模块:
在这里插入图片描述
最后,成功调用:
在这里插入图片描述

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-12-11 16:03:21  更:2021-12-11 16:04:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 21:31:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码