UE4 事件驱动的UI蓝图更新

目标

本文是试通用事件驱动的方式实现UI widget的更新。
(对于这个问题我在网上查了老半天,都说“事件驱动”好,但又不写具体的实现方式,而且UI widget与普通蓝图的通信又稍有不同,因此就详细记录一下)

过程

1 基础准备

现在工程目录下分别创建“工程蓝图”和“UI Widget”,问方法就是“右键”->“关卡”,命名为“TransTest”;“右键”->“用户界面”->“控件蓝图”,命名为“UI_TransTest”。
在这里插入图片描述
然后在关卡蓝图里面随便放几个部件,在UI空间中随便拖几个按钮,这在程序里都用不到,那么基础就准备好了。

2 显示UI

仅仅创建了“UI_TransTest”是不能直接在场景中显示的,还需要再关卡蓝图中对其进行初始化并设置显示:在“事件图表”(就是双击蓝图弹出的主界面)中右键单击并输入“Create Widget”生成一个“创建控件”节点,在该节点中指定类的名称为“UI_TransTest”;然后右键输入“Add To Viewport”创建一个“添加到视口节点”(注意:要取消情景关联,不然你查不到这个节点)
这样UI就可以显示了。
在这里插入图片描述

3 创建事件

我们的目标是实现“关卡蓝图发出事件”->“UI控件接收事件”的流程。因此需要在UI控件中创建一个自定义事件(custom event)。
双击打开“UI_TransTest”蓝图,在右上角选择“图表模式”,在事件图表中右键,输入“custom event”,选择创建自定义事件,事件图表中就会出现一个“自定义事件”节点,给它命名为“randomTest”(你可以选择随便一个你喜欢的名字,比如KickAss),选中该“randomTest”节点,在左边的细节栏里面添加1-n个参数,随你喜欢。
在这里插入图片描述
为了不让这个事件太孤单,给他添加了一个后续的流程,比如打印一个字符串
在这里插入图片描述

4 创建实例

在关卡蓝图(TransTest)中实现对界面组件(UI_TransTest)的调用,需要在关卡蓝图中添加一个界面组件的实例对象引用,通过该引用才能实现具体的方法。
首先,在右侧的“我的蓝图”栏中添加新的变量,将其命名为(UI_TransTest_Obj),然后设置变量类型为“UI_TransTest”。(这一步在普通蓝图通信中也是必要的,重要的是下一步)
在这里插入图片描述
该变量虽然创建完成了,但是实际上并没有实例化,需要进行对该变量的赋值完成实例化。那实例化的顺序就应该放到上文(第二条)创建控件(Create Widget)后面,正好:把变量“UI_TransTest_Obj”从变量列表中拖出来,拖动到事件图表中,选择“SET”,然后把“创建控件”的返回值传给它,就完成了实例化赋值了。
在这里插入图片描述

5 事件调用

完成了上述的准备工作之后,就可以进行事件调用了。
咱们是打算在每一帧都要调用这个事件,那先创建一个Tick节点。
在关卡蓝图(TransTest)的“事件图表”中,右键输入“RandomTest”(就是上文给自定义事件设置的一个随机的名字),然后就能看到这个自定义事件的调用节点了,注意他的输入值“目标:self”是必填了,但是这个目标不能是Self,如果是Self的话就报错了,这个应该是咱们上文获取的UI_TransTest_Obj对象。
那就把UI_TransTest_Obj拖到事件图表中,把他跟目标连起来!
在这里插入图片描述

6 运行

两个蓝图文件都编译一下,点播放,就可以看到经由界面组件的控制,场景中在疯狂的输出数据了。

结论

这个问题对我造成的困扰,主要原因有两个:

  1. 我对蓝图对象的机制还不是很懂
  2. 是UI组件相对于普通蓝图对象还不太一样。需要额外的初始化(也就是上文的第四小节)
    好在是解决了。😄
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值