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为负数的话是不符合数组长度取值的一个规范的。 情况二&…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...