UE5.4内容示例(4)UI_UMG - 学习笔记
https://www.unrealengine.com/marketplace/zh-CN/product/content-examples
《内容示例》是学习UE5的基础示例,可以用此熟悉一遍UE5的功能
UI示例
- UI_UMG :基本UMG
- UI_CommonUI :UMG多层应用
- UI_SlatePostBuffer UI :FX的示例,UI在全局效果的使用
UI_UMG示例
开始:关于UE5的程序启动(入口)
示例需要了解UE5程序入口,一般先要注意3处地方:
- 项目设置->地图和模式
这里可以配置GameMode与GameInstance;如果配置了,会启动对应的程序;如以下表示没有做任何配置(另外需要注意 项目设置->输入,这里会配置一些操作映射)
- 世界场景设置
这里可以配置GameMode,与第1条是重复的配置,这里的配置会覆盖第1条的配置。
如果看到GameMode有配置,点下放大镜,可以找到并打开此GameMode蓝图
看到GameMode_UMG蓝图中,被更改的类
从这2处地方收集到,入口程序需要关注的:GameMode_UMG、BP_PlayerController_UMG、MyCharacter_UMG这3个程序。
- 关卡蓝图
另还有一个地方需要关注:打开关卡蓝图,查看有没有启动的程序代码
开始:关于GameMode、PlayerController、Pawn等关系
- 在写程序时,很难规划好,什么功能写在pawn里,什么功能写在playerController里
- Pawn是角色,写角色的功能和接口,比如坦克可以开炮和行动,开炮和行动的功能写到Pawn,并提供控制接口。AI或Player是负责操作接口进行控制。
- PlayerController处理操作Pawn提供的接口,还需要操作UI、关联Input和摄像机运动等,承担了更多的控制工作
- 但也有很多程序并不这样编写。是把功能直接集成到Pawn里。
- 那这几个类,哪个类是先执行的?经测试(按print字符的先后);
发现顺序是:
- PlayerController
- 规则根据组合情况而不同,包括GameMode、Pawn、Actor,是不确定的运行顺序
- Pawn单独运行时,顺序高于PlayerController,但拖入Actor蓝图中,顺序就低于PlayerController
- Player Start:玩家的起始位置
可以把Pawn拖入场景,选择下Player 0等配置,等效于Player Start
在入口类GameMode、PlayerController、Pawn等中,只有Pawn是可以被投入场景(Outliner大纲)中的
开始:UE5入口的思考
以上UE5提供的入口思维,似乎已经完美解决了问题。
但是,有一个问题在这样的结构下,显得不好操作:
一般我们做项目,需要做一些项目的配置,比如UI的首页是什么,默认有哪些模型先显示或运行、或者读取外部的哪些数据或图片等。
那这些配置的功能要在写在哪里呢?若按照UE5的入口规则,需要在GameMode(或者GameInstance)里进行配置,比较符合UE5的原意。
只是GameMode配置,要么在蓝图中,要么在变量中,这2处都不是很好配置。
熟悉Unity编程的同学,会习惯于在项目窗口里配置(相当于UE5的Outliner大纲里),会制作Manager对象完成配置工作。
个人感觉,同样可以制作Manager对象,结合世界场景设置,用PlayerController启动配置对象,来完成UE5的入口配置问题。
1.1 Sliders
-
MyCharacter_UMG:
分为3类功能:控制UI的功能(显示、隐藏等)、控制角色移动的功能(鼠标看、走、跑)、生命值的功能 -
MyCharacter_UMG - UI功能:
BeginPlayer是定义了一个Exit的UI
ShowElement:Lock Input UI是只使用UI模式;ShowElement把UMG类Create后加到屏幕Viewport中;并把Exit HUD(退出按钮的UI)也加到屏幕中。做了一个HUDActive的状态标记。
若Lock Input UI为false,则触发UI后,角色还是可以继续走动。
HideElement:隐藏UI -
BP_EventDemoTrigger,触发器
触发器可配置一个要显示的蓝图类、3DWidget还是HUD、是否Lock Input to UI
Event ActorBeginOverlap:当触发它的触碰区域后,默认会触发这个事件
关于bool值的用法思考:
bool值有用于配置项的、有用于状态记录的,还有其他适合bool值的参数
如果是配置项的,可以If开头;状态的,可以Is开头;
关于状态的设计思考:
一个对象对外开放控制的接口,状态应该隐藏在接口里面,抽象出若干事件作为接口
参考软件的设计模式 - 状态模式
MyCharacter_UMG抽象出了ShowElement与HideElement 2个接口
另外,把Current Button(触发器)的对象传给UI,是为关闭UI时,同时触发触发器模型的灯的关闭;
- BP_PlayerController_UMG
FreeMouse:显示鼠标
BindMouse:游戏模式
按照PlayerController与Pawn的分工,UI操作可以放在PlayerController里,不需要2个地方都放起来
触发过程:
- BP_EventDemoTrigger触发Overlap,找到Pawn(Character),为Pawn赋值触发器对象与UI类,然后运行ShowElement;
- ShowElement, 先CreateUI,加入屏幕,设置鼠标与UI操作模式
- UMG_Sliders
Begin:通过PlayerController设置下鼠标状态
这里使用了Text的绑定函数的功能,个人不推荐在实际项目中使用
- 当使用 Show Only Modified Properties来查看哪些属性被修改了时,而这个绑定是筛选不出来的
- 编程东一点西一点,就完全没有线索了
可以使用Sliders的OnValueChanged简单实现
1.2 Buttons
- 通过在Text的Visibility绑定Get Visiblity_0的函数,实现Text的隐藏;实际项目中,不推荐绑定的做法。
- 如何快速地 创建或定位 一个Button的OnClicked事件
在Designer里,选中某Button;切换到Graph视口,此时Variables会选在Button上;在右边能看到Events列表,点击创建或定位
1.3 Input
- UI里有3个组件:SpinBox,ComboBox,CheckBox
SpinBox取值
ComboBox判断是否有选择,示例是判断获取的值是否为空,其实可以判断Index值,没有选为-1
ComboBox取值
CheckBox取值
1.4 Nested widgets
- 嵌套UI,主UIWidget_NestedWidgets,在右侧有一个Scroll Box,是放嵌套的UI
- 这里蓝图写得有点乱,主要2个功能:
- 创建Widget_PlayerEntry的UI,嵌套在框中
- 当Input里的值改变时,改变嵌套的UI里的值
这里用到PlayerData结构体
在Widget_PlayerEntry中,绑定各文字框的值
在主UI中,当Input的值改变时,重新组成PlayerData数据,并赋给Created Widget
2.1 Progress Bars
- 通过2个按钮,增加或减少Progress Bar Percent的值,并判断下这个值的上下限;并给Progress Bar 赋值
- 可以打开Hide Unrelated的按钮,清晰看到一条蓝图的主线
2.2 Progress Bars
- 与上面示例的差别:值是在MyCharacher_UMG里health值
- 调用了Increase health接口来增加health值
Cast To是非常消耗性能的,所以要在Begin的时候,先做一遍Cast to保存起来
另外,绑定的函数里,使用Cast To性能消耗太大
2.3 3D Widgets
- 这里采用了BP_EventDemoTrigger_3D,而非BP_EventDemoTrigger
就是说,BP_EventDemoTrigger里的Show3DWidget这个配置项是假的,Display HUD也是无用的 - BP_EventDemoTrigger_3D里有一个3dWidget的组件,初始为隐藏,通过Overlap,来控制显示
讨论下,如果使用原来的触发器,要怎么实现:
把3D Widgets单独做一个蓝图Actor,放到场景中
触发器会触发PlayerController(这里是Pawn)
PlayerController可以根据tag,找到3D Widgets,触发显示3DUI(tag的名字可以和蓝图类名一致)
2.4 Widget Animation
- UMG的Animations功能,示例有Bounce和Scale 2个动画(另外一个动画是无用的)
- 如何启动动画?
如果Loops这里设置成0,即为循环 - 如何停止动画?可以使用单独动画停止,或全部动画停止
- 如何全部播放动画?
可以先建立一个动画数组,然后循环播放
3.1 Images
- 此示例边上有一个摄像头,拍摄人物的动画,并实时渲染到UI中
- 摄像机的蓝图RenderCapture,里面有Camera和Scene Capture Component 2D 2个组件;
Scene Capture Component 2D选了RenderTarget图片;用于实时拍摄保存。
- 建立一个材质 M_RenderTarget,材质类型是User Interface
- 图片绑定这个材质
一个问题是,这张图片的色彩太暗了,如何配置成和实际场景的色彩差不多呢?
在Scene Capture Component 2D进行一些配置
对环境光的亮度进行一些调整
对RenderTarget图片的大小也可以调整
最后调整下UI里的图片比例,呈现出合适的效果
3.2 Widget Slots
- 在Canvas Panel中,可以通过设置图片的Slot,重新设定位置(这个写法比较特殊,需要Cast To)
3.3 Loading Icons
- 这里展示了3种进度条:CircularThrobber、Throbber、ProgressBar
- Throbber可以放一张图片作为加载效果,可以设置多个块(Number Of Pieces)
3.4 Alignment Options
- 3种布局方式:Horizontal Box、Vertical Box、Uniform Grid Panel
- 其中Horizontal Box、Vertical Box是自动布局的,随便拖一些组件进去,就会横向或纵向自动局部
- Uniform Grid Panel是需要在子元素里,设置行列2个值,才能定位在正确的位置
- 这样总要去写这个2个值比较麻烦,可以做一个蓝图去自动实现
本示例就学习完毕,欢迎同学一起讨论指教,本人微信:canchs
相关文章:

UE5.4内容示例(4)UI_UMG - 学习笔记
https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例,可以用此熟悉一遍UE5的功能 UI示例 UI_UMG :基本UMGUI_CommonUI :UMG多层应用UI_SlatePostBuffer UI :FX的示例&…...

C#实现数据采集系统-配置文件化
系统优化-配置 配置信息ip端口,还有点位信息,什么的都是直接在代码里直接写死,添加点位,修改配置,比较麻烦,每次修改都需要重新生成打包。 所以将这些配置都改成配置文件,这样只需要修改配置文件,程序无须修改,即可更新。 配置代码: 如果我们有100个采集,一个个去…...

Java面试题 -- 为什么重写equals就一定要重写hashcode方法
在回答这个问题之前我们先要了解equals与hascode方法的本质是做什么的 1. equals方法 public boolean equals(Object obj) {return (this obj);}我们可以看到equals在不重写的情况下是使用判断地址值是否相同 所以默认的 equals 的逻辑就是判断的双方是否引用了一个对象&am…...

J031_使用TCP协议支持与多个客户端同时通信
一、需求文档 使用TCP协议支持与多个客户端同时通信。 1.1 Client package com.itheima.tcp2;import java.io.DataOutputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner;public class Client {public static void main(String[] a…...
二分查找(精确查找、范围搜索)
目录 1. 二分查找概述2. 精确查找2.1 【left,right】2. 2 【left,right) 3. 范围查找总结 1. 二分查找概述 二分查找法,也称为二分搜索法或折半查找法,是一种在有序数组中查找特定元素的搜索算法。其基本思想是&#x…...
软件工程简记
文章目录 一、软件工程要点之软件设计二、UML(Unified Modeling Language,统一建模语言)(一)UML 的整体分类与部分功能(二)UML 各类图的具体内容三、开发模型(一)多种开发模型的特点与问题四、设计模式(一)设计模式的总体概念与原则(二)软件结构设计原则(三)常见…...

【深度学习】【语音TTS】OpenVoice v2,测评,中英文语料,Docker镜像,对比GPT-SoVITS、FishAudio、BertVITS2
https://github.com/myshell-ai/OpenVoice/blob/main/docs/USAGE.md 实际体验OpenVoice v2的TTS效果。 文章目录 环境启动 jupyter代码代码分析主要模块和功能测试一些别的中文和中英文混合总结优点缺点对比GPT-SoVITS、FishAudio、BertVITS2使用我的Docker镜像快速体验OpenVo…...

Kotlin OpenCV 图像图像50 Haar 级联分类器模型
Kotlin OpenCV 图像图像50 Haar 级联分类器模型 1 OpenCV Haar 级联分类器模型2 Kotlin OpenCV Haar 测试代码 1 OpenCV Haar 级联分类器模型 Haar级联分类器是一种用于对象检测(如人脸检测)的机器学习算法。它由Paul Viola和Michael Jones在2001年提出…...

嗖嗖移动业务大厅(Java版)
首先对此项目说明一下,我只完成了项目的基本需求,另外增加了一个用户反馈的功能,但是可能项目中间使用嗖嗖这个功能还有一些需要完善的地方,或者还有一些小bug,就当给大家参考一下了,希望谅解。代码我也上传…...
hcia复习笔记
一、OSI 七层模型 应用层:为应用程序提供服务,如文件传输、电子邮件等。 表示层:数据格式转换、加密解密、压缩解压缩。 会话层:建立、维护和管理会话。 传输层:提供端到端的可靠或不可靠的数据传输服务࿰…...

pycharm中安装、使用扩展工具,以QT Designer为例
pycharm中安装、使用扩展工具,以QT Designer为例 第一步,下载QT Designer安装包。找到QT Designer.exe所在位置,复制路径 第二步,打开Pycharm,选择Setting,找到扩展工具(External Tools…...
【Rust光年纪】Rust语言实用库汇总:从机器翻译到全文搜索引擎
优秀的Rust语言库探索:机器翻译、音频编解码和全文搜索引擎 前言 Rust语言在近年来迅速崛起,成为了一种备受欢迎的系统级编程语言。随着其生态系统的不断丰富,涌现出了许多优秀的库和工具。本文将重点介绍几个用于Rust语言的重要库…...

学习笔记 - 二极管的参数与选型
二极管 普通二极管: 1N4148(高频开关二极管) 整流二极管: 1N4007 1A 1000V1N5408 3A 1000V 肖特基二极管 (白线边为阴极) SS14 SS34 SS54 常见肖特基二极管参数 快恢复二极管 FR107 FR207 FR307 UF4007 可以用快恢复二…...

PMP--冲刺--易混概念
文章目录 十大知识领域一、整合管理项目管理计划与项目文件的区分: 二、范围管理三、进度管理赶工与快速跟进的区分:赶工增加资源,以最小的成本代价来压缩进度工期;快速跟进,将正常情况下按顺序进行的活动或阶段改为至…...

Resolving Maven dependencies
Maven是一种项目管理和构建工具,通常用于Java项目。这个过程包括下载项目所需的所有外部库和插件,并将它们添加到项目的构建路径中。具体来说,它正在处理名为“AAS_byBasyx”的项目或模块的依赖项。这种任务通常在你打开一个新的Maven项目或更…...

【Spring】SSM框架整合Spring和SpringMVC
目录 1.项目结构 2.项目的pom.xml文件 3.spring.xml和springMVC配置文件 4.database.properties和mybatis.xml配置文件 5. 代码编写 6.测试整合结果 1.项目结构 首先创建一个名为ssm_pro的Mavew项目,然后再在主目录和资源目录下,创建如下所示的结…...

优维2024年中思考:大模型赋予新一代运维的“非产品性”启示
近年来,人工智能在各个行业的应用大幅增加,人工智能技术取得重大进步的领域之一是IT运维。 去年四季度,优维科技敏锐地提出“新一代运维核心系统提供商”的战略新定位,决定将“DevOps及运维”回归到“运维”本身,但我…...
【中药网络药理学】筛选细胞衰老和预后相关基因(附分类代码和画图代码)
1、衰老相关基因 从HAGR和msigdb数据获取细胞衰老相关基因,将两者取交集后构建基因蛋白互作网络 HAGR数据库 该库本身提供了下载链接,我在下载后对其进行了清洗 msigdb数据库 以"aging"作为关键词,Search Filters中collection…...

华为的流程体系
缘由 2010年,华为销售额为1850亿元,其中国际市场占65%,净利润238亿元。当时,公司员工达11万人,公司处理合同达5万多个,290万个订单,大量的工作是手工处理,没有统一的流程支持&#…...
算法——长度最小的子数组209 对比代码随想录题解中对于result取值为Integer.MAX_VALUE的思考
具体解题过程可看代码随想录,我主要是对于为什么result也就是子数组和初始化要为Integer.MAX_VALUE有一个疑惑,为什么不是其他值,经过思考后我发现: 情况一:如果result为负数的话是不符合数组长度取值的一个规范的。 情况二&…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...

C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...

Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础,但这一子系统结构复杂,常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题,需要一套工具化、…...