目录

Runtime UI

关联控件和数据

拾取UI

拾取逻辑的实现

背包UI和逻辑实现

UI节点

动画UI

拖放UI


Runtime UI

  • UIWidget蓝图类包括Event Graph 和 Designer

  • UI控件布局:

    边界 网格框 水平/垂直框 尺寸框 包裹框 间隔区

  • GameInstance中自定义UI控件创建事件并保存控件变量

    • get player controller

    • create widget

    • add viewport

  • 在GameMode中调用UI控件创建事件(不能在instance中调用,此时还未初始化)

    • get game instance

    • cast to 自定义的game instance

关联控件和数据

  • 保存关联蓝图类的引用

  • 通过bind绑定,在bind函数中实现数据关联UI(固定绑定)

拾取UI

  • item作为一个单独的widget(自定义button)嵌入拾取UI widget

  • item添加设置图标和文字的自定义事件(提供事件动态绑定)

    • 设置图标:set brush from texture(纹理设置笔刷)

      图标的类型是一个2d纹理对象,图标可以通过mesh中截图后ps处理产生(png文件)

    • 设置文字:set text

    • 所有需要设置的UI元素都要先勾选Is a variable

  • 拾取UI图表:

    • AddItem事件:调用item的设置事件并add child to 滚动条

    • DeleteItem事件:

    • DeleteAllItems事件:

      • has any child判断

      • while loop循环

      • remove child at(按索引删除)

  • MyInstance实现UI创建和隐藏:

    • 创建前最好先判断有效,避免重复创建

    • 添加view port前再判断:is in viewport

    • 对于有效的直接add viewport(隐藏后再次打开)

    • 隐藏:remove from parent (父项是viewport)

    • add viewport后需要设置面板为鼠标&游戏模式和鼠标可见,隐藏面板后恢复鼠标&游戏模式为纯游戏模式:

      • set game input mode

      • set show cursor(bool变量)

拾取逻辑的实现

  • 拾取物品需要同时销毁场景中的item实例和拾取面板中的itemUI,因此需要建立itemUI和item实例的映射,可用字典实现(这一步为临时方案,如果有背包系统,在调用pickup蓝图接口时才去销毁场景中的item,且不需要销毁itemUI,销毁item后被认为离开了范围,物品检测逻辑会销毁itemUI)

    • itemUI增加一个itemBaseRef存放场景实例

    • 拾取面板UI增加一个{itemBase : itemUI}的一个映射字典

    • 在addItem_Evt事件添加itemUI到面板的滚动条时,同时处理字典映射关系的增加和itemBaseRef的设置, itemBase来自场景中的实例,通过事件参数提供出去

    • 拾取UI中单个itemUI的删除也可以利用该字典去查找删除

  • itemUI提供鼠标点击事件:

    • 删除场景中关联的itemBase和itemUI(如果有背包,只删除itemUI)

    • 如果点击事件同时删除自身itemUI,会导致字典的映射关系出现空键值对!需要同时更新字典:

      • 需要把itemUI被删除的事件通知给拾取UI,通过event dispatcher来实现:event dispatcher可以绑定多个事件,同时监听和处理多个事件(绑定+委托)

      • 具体地,给ItemUI增加一个event dispatcher,同时给event dispatcher一个自身引用的参数,并直接call该事件分发器,把自己ItemUI传出去

背包UI和逻辑实现

  • 背包itemSlot结构体及背包蓝图创建

    • type是itemBase的class reference,因为背包中的item不需要实例,只是一个概念

    • 背包的逻辑可以放在playerState或角色中,playerstate更好

    • 背包继承自Object,不能放置场景,只记录一些物品的概念

  • 背包添加itemSlot的逻辑:先判断是否超重,超重直接返回;未超重遍历背包中的所有slots,如果有物体名称一样,则直接增加count;若遍历完没有找到,则添加一个新的itemSlot

    • 注意:for each循环的element输出是copy,不能直接使用,需要根据索引按reference方式获取

  • 背包对象的新建:

    • 对于继承自Actor的类型是可以放置在场景中的,实例创建方法:

      • Spawn Actor

      • make transform传入场景信息

    • 而背包是一个集成自Obejct的类型,构造函数与Actor不同:

      • construct (从类构建对象)

    • 在事件开始时调用背包构造并设置引用,完成初始化

  • 触发背包添加itemSlot的逻辑:

    • 接着上面拾取逻辑,在itemButton监听到itemUI被点击后,会删除itemUI和场景实体item,同时event dispater委托更新了dict(删除该item的映射关系),此处是添加物品到背包逻辑的起点:

      • 如果背包容量超重,此时不应该删除UI(点击UI没反应),也不应该删除场景item:

      • 如果未超重,则完成拾取,调用pickup方法完成销毁

      • 背包未超重时UI无需销毁:因为场景item被销毁后就碰撞检测就认为人物离开了范围,物品检测的逻辑会调用删除itemUI的逻辑,因此不需要再单独删itemUI

    • 因此在更新dict之前先添加itemSlot到背包:

      • 获取此UI关联的Pawn:get owning pawn,右键可以转换为纯类型转换函数,省去执行流

      • charactor新建pickupItem的自定义事件:调用背包的添加itemSlot逻辑函数,并调用物品自己的蓝图接口方法:pickup

      • pickup接口方法实现为销毁自己,所有可被拾取的基类中实现即可,继承的子类都会继承实现,对于不同行为的重写方法即可

  • 背包添加物体的事件可以直接在construct执行,因为背包UI被创建时item信息是确定的,与pickable动态获取不同:

    • 直接通过charator获取player state 然后获取Backage实例对象,然后初始化引用

    • 添加子元素到滚动条,需要先打开Is A variable,将滚动条生成新变量,命名为itemContainer

    • 背包UI新建一个背包itemSlot结构体类型info变量,设置为公开引脚和公有,然后背包UI在构造时循环创建itemSlotUI并添加到滚动条子项即可:for each loop + create widget + add child

    • 在循环前需要清理container:clear all children

  • 背包UI实时关注内容变化,而不是重新打开时才更新:

    • 同样通过event dispacher实现

    • for loop可以控制循环的起终索引

UI节点

  • Border绑定鼠标按键:get effecting button - equal, 返回handled

  • 将函数转换为事件绑定:create event

动画UI

  • 创建animation轨迹,并指定控制的控件(需要重命名),设置起终时间

  • 在细节面板点击图标创建关键帧,有该图标的都是可以被动画修改的属性

  • 按住ctrl点击关键帧可以修改指定帧的值

  • 当打开自动关键帧时,若滑条移到的位置有指定属性被修改,则自动添加一个关键帧,前提是已经手动插入了一帧关键帧

  • 调用动画

    UI事件图表中变量animation分类下包含所有创建的动画轨迹

    • play animation:开始播放

    • stop animation:停止播放

拖放UI

  • 拖放相关对象:继承DragDropOperation 创建WidgetDrag蓝图,待drag的原始UI,以及drag中的虚拟UI_DragWiget,接收drop的UI

  • 添加 OnMouseButtonDownOnDragDetected 覆盖

  • OnMouseButtonDown实现检测drag

  • OnDragDetected实现drag逻辑

  • OnDrop设置接收drop的UI

    • 接收drop的UI需要设置behavior的可见性为visible

    • 覆盖OnDrop实现,如放置到指定位置:

  • 让UI_DragWiget变为可视控件

UE4 UMG基础笔记相关推荐

  1. UE4 LandScape基础笔记

    目录 Landscape基本工具 LandMass插件工具 landscape材质 landscape根据权重绘制植被 地貌材质相关节点 地形材质像素深度偏移 三种植被工具 Landscape基本工具 ...

  2. UE4 美术学习笔记和经验

    原文地址:UE4 美术学习笔记和经验 原文作者:liuk718 以下内容针对入门或者入门不久的美术们. 一.在迪斯尼shader体系(ue4)中:金属漫颜色非纯黑,而传统PBR shader体系(Vr ...

  3. JavaScript基础笔记集合(转)

    JavaScript基础笔记集合 JavaScript基础笔记集合   js简介 js是脚本语言.浏览器是逐行的读取代码,而传统编程会在执行前进行编译   js存放的位置 html脚本必须放在< ...

  4. Python初学者零碎基础笔记(一)

    Python初学者零碎基础笔记 一行代码输入多个参数 方法1.) a,b,c=map(类型,input("请输入").split()) #默认空格分隔,若要转其他类型,把类型换成需 ...

  5. Jmeter使用基础笔记-写一个http请求

    前言 本篇文章主要讲述2个部分: 搭建一个简单的测试环境 用Jmeter发送一个简单的http请求 搭建测试环境 编写flask代码(我参考了开源项目HttpRunner的测试服务器),将如下的代码保 ...

  6. UWP入门(二) -- 基础笔记

    UWP入门(二) -- 基础笔记 原文:UWP入门(二) -- 基础笔记 不错的UWP入门视频,1092417123,欢迎交流 UWP-04 - What i XMAL? XAML - XML Syn ...

  7. [云炬创业基础笔记]第五章创业机会评估测试2

    [云炬创业基础笔记]第五章创业机会评估测试1

  8. [云炬创业基础笔记] 第四章测试17

    [云炬创业基础笔记] 第四章测试7

  9. [云炬创业基础笔记] 第四章测试15

    [云炬创业基础笔记] 第四章测试7

最新文章

  1. 比 Spring Boot 快 10 倍的 Bootique 框架
  2. 0x13.基础数据结构 — 链表与邻接表
  3. 开发笔记:游戏逻辑模块组织及数据同步
  4. element中el-upload和vue-cropper结合实现上传头像裁剪大小
  5. 上班骚扰男同事被抓到......
  6. 如何加声调口诀_声母韵母口诀顺口溜歌曲(怎么快速记住声母韵母)
  7. scala初学之Tuple、Array、Map、文件操作入门实战
  8. 七步从AngularJS菜鸟到专家(6):服务
  9. azure机器学习_Azure机器学习中的预测
  10. java.lang.NullPointerException org.apache.jsp.index_jsp._jspInit(index_jsp.java:22)
  11. python 百度ai json解析_百度AI识别调用的简单例子
  12. 完整的连接器设计手册_连接器卧式插拔力的测试介绍
  13. 重庆高清卫星地图(含道路标签数据叠加)
  14. 模电与数电的基本知识 (学习备用)
  15. excel浏览器直接下载
  16. 戴尔笔记本修改硬盘模式为AHCI再安装ubuntu
  17. windows2008 r2 sp1 启用网络发现设置无法保存的解决办法
  18. cmd无法进入其他盘符问题解决方案
  19. 灵活的Vue组件——原来这么简单
  20. 华为南研所2015年面试经历总结

热门文章

  1. vue 分页表格数据导出
  2. 图形界面介绍Set Preference—Design
  3. 在 isilon 的 Samba 中接入 LDAP 认证并严格控制权限
  4. 【传感器大赏】巡线模块
  5. 使用Prometheus+Alertmanager告警JVM异常情况
  6. 11. 计算排列的编号【组合数学】
  7. Java外包是如何转正华为的
  8. RFID仓库管理解决方案,挑选RFID仓库管理系统的影响因素-新导智能
  9. 图形化编程——RFID智能门禁
  10. esp32 s3 USB OTG Arduino可以下载固件 USB COM不可以的解决方法