[UE4] UI部分

2023-10-30

UMG基础

虚幻示意图形界面设计器(Unreal Motion Graphics UI Designer)(UMG) 是一个可视化的UI创作工具,可以用来创建UI元素,如游戏中的HUD、菜单或您希望呈现给用户的其他界面相关图形。

UMG的核心是控件,这些控件是一系列预先制作的函数,可用于构建界面(如按钮、复选框、滑块、进度条等)。这些控件在专门的控件蓝图中编辑,该蓝图使用两个选项卡进行构造:设计器(Designer)选项卡允许界面和基本函数的可视化布局,而图表(Graph)选项卡提供所使用控件背后的功能。

蓝图

UMG UI设计器快速入门
【新手必读】Unreal Engine 4 UI入门教程(上)
【新手必读】Unreal Engine 4 UI入门教程(下)
关卡蓝图UI

单个关卡添加简单UI的基本步骤记录:

  1. 在角色蓝图中存放数据,和编写数据变化的逻辑
  2. 在UI蓝图中设计器模式中布置UI控件
  3. 在UI蓝图的图表模式中获取数据,然后关联UI控件
  4. 在角色蓝图中将UI蓝图添加到视口
    在这里插入图片描述

涉及多个关卡跳转UI的基本步骤记录:
以两个关卡为例:Main(设置关卡); FirstPersonExampleMap(游戏关卡)
5. 在Main的UI蓝图中布局控件
6. 为每个按钮添加点击事件
7. 在Main的UI蓝图的图表模式中为按钮点击事件添加执行逻辑
8. 在Main关卡的关卡蓝图中显示UI面板,同时,设置鼠标显示或隐藏
在这里插入图片描述
9. 在Main关卡的worldsetting中设置默认的pawn类为引擎默认的Character
在这里插入图片描述
因为我们不希望玩家能够在主菜单(Main Menu)后四处奔跑和射击,所以我们现在要为这张地图分配一个游戏模式,并更改玩家的角色,使其使用可玩的 第一人称角色(FirstPersonCharacter) 蓝图中的引擎默认角色。

在上面基础上增加一个PauseMenu的步骤:

  1. 在PauseMenu的UI蓝图中添加控件
  2. 在PauseMenu的UI蓝图的图表模式中为按钮添加逻辑
  3. 在角色蓝图中添加一个键盘按钮点击事件并添加用于创建PauseMenu的UI实例的逻辑
    在这里插入图片描述

几点思考

  1. UI控件的细节面板中 isVariable 和 ZOrder 的作用?

将控件进行命名,并将其设为一个变量,后续才能在UI蓝图的图表中进行访问和控制,最好将需要控制的UI控件都勾选isVariable;同时,设置 ZOrder,以便它出现在稍后将设置的图像的顶部。

  1. 创建控件蓝图(UI)时,建议将其提升为变量,以便之后通过蓝图脚本进行访问。
  1. 函数绑定,属性绑定,事件驱动的区别

用事件驱动UI更新
函数绑定等同于提问:"玩家角色蓝图是什么?"而在了解后,逐帧调用函数,这比较消耗性能

属性绑定在构造时获取对玩家角色蓝图的引用,无需逐帧投射并检查"玩家角色蓝图是什么?仅逐帧查询生命和能量值,比函数绑定开销更低。
事件驱动将HUD控件蓝图中的自定义事件将在玩家生命变化时检查并更新其显示,而非无论是否变化固定进行检查。

  1. 在角色蓝图中,将 事件调度器 节点添加到递减生命的脚本末端。
  2. 现在减少生命时,将调用此事件调度器。在HUD控件蓝图的事件图表中,可再次使用Event Construct获取并保存对玩家角色蓝图的引用。还可将自定义事件绑定到该角色蓝图中的事件调度器,调用事件调度器时便调用该自定义事件。
  3. 下图展示将生命和能量整合到同一个Event Construct脚本中的方法。
    在这里插入图片描述
  1. 在UI蓝图中怎样在Text控件上修改Text的内容?

首先,对应的函数为SetText(Text)
在这里插入图片描述
其次,
在这里插入图片描述

  1. 蓝图之间的通信
    UE4-(蓝图)第二十课蓝图之间的通信(类型转换、公开变量)

UMG和C++交互

UMG最佳实践

UE4 C++ —— UMG和C++交互

[UE4]UMG使用实例(C++)

UE4随笔:UMG与C++交互

使用UMG的用户界面

在这里插入图片描述

  • 加载UI蓝图的C++代码示例
auto Path = TEXT("WidgetBlueprint'/Game/Res/UI/Login/LoginForm.LoginForm_C'");
UClass* WidgetCls = LoadClass<UUserWidget>(NULL, Path);
if (APlayerController* PC = GetWold()->GetFirstPlayerController())
{
    UUserWidget* Widget = CreateWidget<UUserWidget>(PC, WidgetCls);
    if (Widget)
    {
        Widget->AddToViewPort();
    }
}
  • C++中获取UMG中的控件,并进行事件绑定

UE4 C++ —— UMG和C++交互

GetWidgetFromName(Name)

自动绑定控件

UPROPERTY(meta = (BindWidget)) // 该变量会自动寻找名为IConImage的按钮进行绑定,如果没找到会编译出错
	class UButton* IConImage;

按钮绑定事件

button->OnClicked.AddDynamic(this, &UMyUserWidget::ClickButton);

图片绑定事件

image->OnMouseButtonDownEvent.BindUFunction(this, "useFunc");

设置控件相关属性

text->SetText(FText::FromString(FString(TEXT("Test Text"))));
image->SetIsEnabled(0);
text->SetVisibility(ESlateVisibility::Visible);

//设置TextBlock颜色
MyTextBlock->SetColorAndOpacity(FSlateColor(FLinearColor(R / 255.0f, G / 255.0f, B / 255.0f, 1)));

设置鼠标永久可见

void AMyPlayerController::BeginPlay() {
	widget = Cast<UMyUserWidget>(CreateWidget(this, Creation));
	widget->AddToViewport();

	bShowMouseCursor = true;
}

Widget移动

UImage* image = Cast<UImage>(GetWidgetFromName(TEXT("Mouse")));
UCanvasPanelSlot* slot = Cast<UCanvasPanelSlot>(image->Slot);
slot->SetPosition(slot->GetPosition() + FVector2D(0, 1));

获取屏幕大小

UGameplayStatics::GetPlayerController(GetWorld(), 0)->GetViewportSize(x_int,y_int)

获取鼠标位置

float px, py;
if (UGameplayStatics::GetPlayerController(GetWorld(), 0)->GetMousePosition(px, py))

获取当前控件在当前窗口大小下的缩放

UWidgetLayoutLibrary::GetViewportScale(this)

设置Widget的位置(到鼠标位置)(与锚点的偏移会受到窗口大小缩放的影响,所以需要除以缩放)

UImage* image = Cast<UImage>(GetWidgetFromName(TEXT("Mouse")));
UCanvasPanelSlot* slot = Cast<UCanvasPanelSlot>(image->Slot);
auto pc = UGameplayStatics::GetPlayerController(GetWorld(), 0);
if (image && pc) {
	float px, py;
	if (pc->GetMousePosition(px, py)) {
		UCanvasPanel* cp = Cast<UCanvasPanel>(GetWidgetFromName(TEXT("ScreenPanel")));
		float scale = UWidgetLayoutLibrary::GetViewportScale(this);
		slot->SetPosition(FVector2D(px / scale, py / scale));
	}
}

设置鼠标位置(需要在Build.cs里面加SlateCore)

UGameplayStatics::GetPlayerController(GetWorld(), 0)->SetMouseLocation(x,y)

UI基础控件和自定义控件

UMG拼界面常用技术简介

UE4入门之路(UI篇):UMG系统介绍

控件反射器

基础控件

在这里插入图片描述

Border是一个只能包含一个子元素的容器。

  1. 添加一个名为testBorder的UserWidget,添加一个Border到默认成Canvas Panel容器,添加一个TextBlock到Border容器,没有看到TextBlock文字,是因为Border背景是白色、TextBlock的文字颜色也是白色。
  2. Border可以设置背景图片,也可以是颜色。
  3. 背景颜色和背景图片可以同时设置,最终的效果是保留图片纹理+图片颜色背景颜色(“颜色颜色”就是叠加颜色)。
  4. 如果背景颜色为白色,则保留背景图片原本的颜色。也可以设置Brush Color的透明度,这样背景图片也会变得透明了。UE4中的所有颜色都可以设置透明度。
  5. 与其它容器不同的是,Border容器可以在Border本身属性中设置子控件的颜色(不局限与文本控件,子控件也可以是图片等所有UI控件)和透明度,最终的效果是保留图片纹理+图片颜色*Border.Content.Color。
    如果Border.Content.Color为白色,则呈现子控件本来的颜色。
    如果Border的子控件BlockText设置了字体颜色,最终颜色也会跟Border.Content.Color叠加。
  6. Border控件还有一个比较特殊的地方就是可以相应鼠标的各种事件。

Named Slot

用户创建的UI,在成为其他UI的子控件时,默认情况下该子控件是不能拥有子控件的,此时可以给创建的UI中添加一个Named Slot,这个UI就可以拥有子控件。

RichTextBlock
UE4 UMG RichTextBlock功能简介

在这里插入图片描述

ComboBox(String)
ComboBox 下拉菜单

SpinBox 输入一个范围的数值。
UMG Spin Box 和 Text Box 限定输入为 Int

EditableText
EditableText(Multi-Line)
TextBox 输入文本(单行输入)
TextBox(Multi-Line) 多行输入
Text Box(单行、多行、EditableText控件)

在这里插入图片描述

【UE·UI篇】ListView使用经验总结

在这里插入图片描述

自定义控件

可多选的复选框
UE4中UMG CheckBox Group实现

自定义框选
【UE4】实现自定义框选

导入图片
UE4初探——从外部导入图片

3D UI

UE4制作3DUI的方法
控件交互

如使用控件组件显示以 3D UI,还需要玩家与此控件进行交互,可通过Widget Interaction组件来实现交互。
Widget Interaction组件通过射线检测,确定它是否命中世界场景中的控件组件。如命中,可设置规则确定与其交互的方式。 交互通过模拟定义的按键来执行。

UE4制作3DUI的基本步骤

  • 先制作一个控件蓝图,
  • 在实例化一个继承与Actor的类
  • 然后为上面的实例添加一个Widget组件,并将组件的class属性设置为最开始的控件蓝图

UI适配

待补充

优化

制作 UI 画面时可进行以下优化:

  • 尽量为美术资源使用 纹理,尽量不使用 材质。

  • 尽量使用 事件驱动 UI 更新,尽量不使用绑定或 Tick 事件。

  • 使用缓存不常变化的控件。

  • 使用 控件反射器(Ctrl+Shift+W)获取关于控件的信息和数据。

UI开发示例

UI对话事件

参考
https://space.bilibili.com/67108639/video

【功能】UE4 AI 对话系统流程演示

SVN进行UE4项目协作

使用SVN进行UE4项目协作

在虚幻 4 中使用 SVN 作为版本控制软件

UE4项目工程的目录结构

开发规范
https://github.com/Allar/ue5-style-guide

问题记录

  1. EventStruction被触发两次的问题
    在这里插入图片描述

  2. 怎么从一个WidgetBlueprint中访问另一个WidgetBlueprint中公开的变量
    在这里插入图片描述
    GetAllWidgetsOfClass在做全局搜索的操作,这里也可以在蓝图定义一个Widget类型的变量,引用另一个蓝图,从而去访问其内部的变量

  3. UE中Multi-Line Text Box换行的快捷键为:Shift + Enter

  4. 在while循环体中调用Delay来延时的时候,陷入死循环的问题
    循环中加入Delay

  5. UE4中UMG响应按键输入事件
    UMG - 键盘快捷键

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[UE4] UI部分 的相关文章

  • AFNetwork 作用和使用方法具体解释

    转自 http www maxiaoguo com clothes 269 html AFNetworking是一个轻量级的iOS网络通信类库 它建立在NSURLConnection和NSOperation等类库的基础上 让非常多网络通信功
  • Qt信号与槽的链接3种方法详解

    转载自 14条消息 Qt5 9 2 VS2017入门实例 透彻解析 冯爽朗的博客 CSDN博客 vs qt 示例 由于现在书上介绍的大部分都是Qt Creator 并没有介绍Qt VS的教程 虽然说很相似 但是也有很多地方不同 对于初学者特
  • 分享 20 道关于 React 开发相关的面试题及答案

    React 面试可能你会觉得有点吓人 为了帮助您自信并准备好迎接下一次面试 我们列出了 20 个常见的 React 问题和参考答案 希望通过本篇文章的内容 能够帮助你重新温习你的 React 知识 复习重要概念 并为你的下一次面试做好更充分
  • 如何正确的关闭 MFC 线程

    前言 近日在网上看到很多人问及如何关闭一下线程 但是我看网上给出的并不详细 而且有些方法还是错误的 小弟在此拙作一篇 不谈别的 只谈及如何正确的关闭MFC的线程 至于Win32和C RunTime的线程暂不涉及 一 关于MFC的线程 MFC
  • 前端自测.

    交互 宽度1200px 表单校验 长度 敏感词汇 初始化 loading 结果 空 表单重复提交 loading 请求拦截 限流 数字 大数据 千分位 文本长度 省略号 数据查询结果校验 按条件查询结果是否正确 空数据传参 xx 参数头尾有
  • MapReduce作业状态一直为ACCEPTED解决过程

    toc 今天在测试Hadoop文件压缩功能时 在之前本地搭建的Hadoop集群上提交了一个MapReduce作业 但是提交后发现一直卡在那不动 18 07 20 17 21 50 WARN util NativeCodeLoader Una
  • 【前端】Vue+Element UI案例:通用后台管理系统-项目总结

    文章目录 相关链接 前言 效果 登录页 首页 管理员的首页 xiaoxiao的首页 用户管理 总结 项目搭建 左侧 CommonAside 上侧 CommonHeader和CommonTag 首页 Home vue 用户管理 User vu
  • 蓝牙App设计2:使用Android Studio制作一个蓝牙软件(包含:代码实现等)

    前言 蓝牙聊天App设计全部有三篇文章 一 UI界面设计 二 蓝牙搜索配对连接实现 三 蓝牙连接聊天 这篇文章是 二 蓝牙搜索配对连接实现 课程1 Android Studio小白安装教程 以及第一个Android项目案例 Hello Wo
  • web移动端布局的那些事儿

    原文地址 github com HuJiaoHJ bl web移动端布局范畴很广 其中比较基础的几个话题 移动端适配 1px border 基础布局 本文主要分享这三个话题 一 移动端适配 提起移动端适配 大家想到的肯定是rem flexi
  • (ps2019)Photoshop 2019 最新破解版下载

    Photoshop CC 2019新增功能 下载地址点我 新功能介绍 https helpx adobe com cn photoshop using whats new html 经过改良设计的内容识别填充 借助 Adobe Sensei
  • 蒙特卡洛积分、重要性采样、低差异序列

    渲染公式 渲染的目标在于计算周围环境的光线有多少从表面像素点反射到相机视口中 要计算总的反射光 每个入射方向的贡献 必须将他们在半球上相加 为入射光线 与法线 的夹角 为方便计算可以使用法线向量和入射向量 单位化 的乘积表示 对于基于图像的
  • LVGL学习(3):页面切换原理和页面管理实现

    在LVGL中 大多情况下是有多个页面的 一般来说页面的切换有两种情况 删除当前的页面 创建新页面加载 保留当前的页面 创建新页面加载 我们来分析一下这两种情况 比如页面1有一个列表框 有三个选项 每个选项对应进入一个页面 假设此时我们的焦点
  • 探索创意无限的Photoshop CC 2020Mac/Win版

    作为一款功能强大的图像处理软件 Photoshop CC 2020 简称PS 2020 在全球范围内备受设计师 摄影师和艺术家的喜爱和推崇 它不仅为用户提供了丰富多样的工具和功能 还不断推出新的创意特效和改进的功能 让用户的创意无限延展 首
  • 「盘点」界面控件DevExtreme UI v23.1中的API增强

    DevExtreme gt https www evget com product 3150 拥有高性能的HTML5 JavaScript小部件集合 使您可以利用现代Web开发堆栈 包括React Angular ASP NET Core
  • vue element-ui el-tooltip组件失效问题

    引用自 https blog csdn net ygrhlh article details 121660806 vue element ui el tooltip组件失效问题 因为公司项目年代久远以及谷歌chrome 80 后的sames
  • Swift 响应式编程:简化 KVO 观察与 UI 事件处理 | 开源日报 No.110

    ReactiveX RxSwift Stars 23 8k License MIT RxSwift 是 Reactive Extensions 标准的 Swift 特定实现 它提供了 Observable 接口来表达计算的通用抽象 该项目旨
  • element ui backTop源码解析-逐行逐析

    backTop 回到顶部 组件简介 基础概念 返回页面顶部的操作按钮 代码
  • HarmonyOS鸿蒙开发指南:容器组建 stepper开发指导

    目录 创建Stepper组件 设置index属性 设置样式 添加事件 场景示例 创建Stepper组件 在pages index目录下的hml文件中创建一个Stepper组件 div class container div
  • Vue + Element-ui组件上传图片报错问题解决方案

    在使用Vue和Element ui组件上传图片时 可能会遇到一些报错问题 以下是一些常见的问题及解决方案 报错 TypeError Cannot read property name of undefined 解决方案 这个错误通常是因为在
  • 界面控件DevExpress WPF属性网格 - 让应用轻松显示编辑各种属性事件

    DevExpress WPF Property Grid 属性网格 灵感来自于Visual Studio Visual Studio启发的属性窗口 对象检查器 让在WPF应用程序显示和编辑任何对象的属性和事件变得更容易 P S DevExp

随机推荐