赞
踩
本文主要对UMG模块中各控件的关键属性与设置进行了简要说明,并以某些具体示例来对某些UI效果的实现方法进行了图文讲解。
2023.11.2 - 备注:越上班越懒得写这些,一年多没更新了,现在更懒得更了,当时刚入职,爱记录这些比较初级的东西,后边有兴趣写点有意思的吧~233333
Create Widget:首先要构建这个UI。
构建完成后,将该UI添加到视口中,这样玩家就能在屏幕中看到该UI。
Widget被附加到了Viewport(也可以是Player's sreen)上,Viewport为其Parent,关闭该UI即为从视口中移除。
For example:对于一个背包系统,当鼠标悬停在某个物品上时,可以显示出该物品相应的详情。
该项一般不会进行修改处理。
询问了一下前辈,将其翻译成转换是不准确的,参考3D数学中的翻译,或对于一个刚体的变换,翻译成“位姿”或许更好?该选项下设计到位置、尺寸、旋转、shear(简单理解就是倾斜度)、Pivot(绕轴枢进行旋转等变换,比如0.5,0.5则表示枢点在控件中心,0,0则表示在左上角)。
FUNCTIONS->Override->OnKeyDown(在widget中无法直接调用按键事件节点)
Event Reply Structure:这个结构体表示你当前处理的事件能否跟着输入流一起继续向下流动。
2. ZOrder值越大,则该控件越晚渲染,故如果你将Text控件的ZOrder值设置为1,那么进度条控件就会优先渲染。
该部分用于设置ProgressBar的进度条和背景的填充图片、尺寸、绘制方式等。
Marquee常用于场景加载时,制作持续读条的效果。
Tips:一个进度条可以看做是两张Image的叠加,是图像的综合。
2. 如果将子布局中的Min Desired Width等选项进行勾选,那么如果将一张图片添加进子布局中,则该图片的大小会被强行压缩在(100,1000)的范围内,如果这个图片小于长/宽小于100,则会被拉伸到100;图片的长/宽位于100到1000内,则不发生变化;图片长/宽大于1000,则会被压缩到1000。
3. 覆盖和限制同时勾选时,只执行覆盖!
4. 当你取消勾选Size To Content时,对SizeBox进行拉伸会导致其中填充的Image发生形变。采用Min/Max Aspect Ratio即可保证达到你想要的拉伸之后的效果,如果你将以上两个值均设置为1,则无论你怎么拉伸,填充的Image均不会发生形变。
可以通过水平框和垂直框的嵌套来更自由灵活地实现你想要的显示效果。
控件本身自带的Padding填充远不如Spacer灵活。如下图所示,在一个horizontal box中的两个Image中填充了宽为50的Spacer控件。
类似于Spacer控件,可以在两个控件中间填充自定义背景。其余的调节选项和前面介绍的其它控件类似。
与之前介绍的控件类似,可以为Button控件设置按钮图标,鼠标移动上去后的效果变化,点击后的图标变化。
鼠标悬停到button之上后的显示效果如下图所示。
3. 可设置点击方法,决定Down and Up或Mouse Down等哪种情况算一次点击事件。注意Precise Click(精确点击),点击还未松开的情况下移动鼠标指针,不会被判定为点击事件。
2. 注意红框中的部分,点击+Animation可以创建一个动画,而动画必定存在一个时间轴(UE4中该部分确实是Timeline),点击+Track可以添加一个轨迹,如下图所示,可以为UI控件添加各种事件轨迹。
3. 回顾一下只狼的钩锁点UI是如何变化的?
当sekiro靠近钩锁点时,钩锁点中心的绿点会逐渐扩大,当绿色点完全覆盖外部白圈的时候,sekiro可以投出钩锁,同时内部的绿点会播放一个先微微增大然后淡化消失的动画表现,同时外部白圈也会消失,这就是我们需要实现的效果。
故我们首先需要设置外部白圈UI(BackGround)在Visable和Hidden之间变换,打好关键帧;然后我们需要设置绿点(Filling)的颜色以及不透明度(Color and Opacity)的变化,最后我们需要设置好Filling的大小的变化(Transform)。
4. 分别添加3.中分析过的Track,分为背景和填充两大部分,
5. 点击具体Track中的+,设置其具体的变化的关键帧,你可以直接修改属性的数值,但通常我们不这么做,因为表现不够直观。
6. 点击自动创建关键帧,这样就能根据你在视口中的修改操作来自动创建关键帧。自动创建关键帧的好处在于能比较直观地观察到UI效果的变化。
7. <- + ->分别表示移动到左边的上一个关键帧的位置、在当前时间轴位置添加关键帧、移动到右边的下一个关键帧的位置。
8. 测试刚刚创建的效果,创建一个点击事件(实际游戏中当然是自己设计一个自定义事件),使用PlayAnimation即可播放,可以看到之前创建的UI动画以变量的形式存在于Graphs中。
先做个血条咯,将这个widget命名为HUD,游戏一开始就要显示血条。制作方法参考前面的章节可轻松完成。
2. 另一种方式是使用事件分配器,事件分配器就是 一种分配事件的逻辑。(我创建了一个名为ChangeHP的事件分配器)
将事件分配器拖入到视口中,可以看到如下选项。
在Hud中使用Bind,将某一事件(ChangeHP2,暂未写具体逻辑)绑定到ChangeHP这一事件分配器上。
然后可以在另一蓝图(本示例中是写在Character蓝图中),使用call来调用ChangeHP这个事件分配器,这样也实现了属性和UI显示的绑定。
3. 为了方便测试与说明,在我的character蓝图添加如下逻辑,每隔一秒在0到100的范围内更改角色的当前生命值。)
4. 在Hud中获取character的引用,接着获取其当前血量和最大血量,计算其百分比。这样就实现了玩家血量与UI显示血量的关联与同步。
(本小节中所有写法均属于不规范的写法,仅供测试)
如下图所示(这里没有调整血条位置,使用的是和怪物相同的血条)。
2. Space这里可以选择World或Screen,World常用于实现3D血条(血条会跟着玩家旋转),Screen常用于实现2D血条(无论你的角色朝向何方,血条都是平铺显示);
该示例中的逻辑仅涉及UI的逻辑,后端的数据交换不在此进行叙述。
在完成鼠标按下函数的重写之后(本示例中采用鼠标右键按下进行物品拖拽),重写拖拽检测函数,这个函数执行如下逻辑:(该部分逻辑写在拖出道具的UI)
(无须关心我的示例UI的结构本身是如何设计)
1,创建一个Drag Drop的操作,使用上图的蓝图节点,class选择自己创建的DragDropItem类,这个DragDropItem用于存放你所拖拽的UI的相关信息。(当前UI的名字、数量、图标等)
2,创建一个拖拽图标,该UI仅需显示当前拖拽道具的icon即可。(你愿意多显示更多的物品信息,随你自定义)
3,因为我们拖出来道具UI后在要拖动到的位置放下鼠标(背包格子1拖动到背包格子2),故Drop逻辑写在拖拽结束位置的UI中。
该部分逻辑也很简单,就是将DragDropItem中存放的道具信息赋给当前物品栏UI的icon、num等即可。以上就实现了一个最简单的物品拖拽的逻辑。多个格子的背包的实现,请自行去了解ViewList控件。
实际上在实现一个背包系统的时候,应完全避免UI与UI之间的通信,所有数据通信也应该只能发生在前端与后端之间,部分不规范的数据获取方式要尽量避免。(去学习设计模式)你在这里拖拽的道具是道具的UI,并不是道具本身,所有的数据处理都在后端进行(C++ or 蓝图)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。