UE4 UMG基础笔记
目录
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
添加 OnMouseButtonDown 和 OnDragDetected 覆盖
OnMouseButtonDown实现检测drag
OnDragDetected实现drag逻辑
OnDrop设置接收drop的UI
接收drop的UI需要设置behavior的可见性为visible
覆盖OnDrop实现,如放置到指定位置:
让UI_DragWiget变为可视控件
UE4 UMG基础笔记相关推荐
- UE4 LandScape基础笔记
目录 Landscape基本工具 LandMass插件工具 landscape材质 landscape根据权重绘制植被 地貌材质相关节点 地形材质像素深度偏移 三种植被工具 Landscape基本工具 ...
- UE4 美术学习笔记和经验
原文地址:UE4 美术学习笔记和经验 原文作者:liuk718 以下内容针对入门或者入门不久的美术们. 一.在迪斯尼shader体系(ue4)中:金属漫颜色非纯黑,而传统PBR shader体系(Vr ...
- JavaScript基础笔记集合(转)
JavaScript基础笔记集合 JavaScript基础笔记集合 js简介 js是脚本语言.浏览器是逐行的读取代码,而传统编程会在执行前进行编译 js存放的位置 html脚本必须放在< ...
- Python初学者零碎基础笔记(一)
Python初学者零碎基础笔记 一行代码输入多个参数 方法1.) a,b,c=map(类型,input("请输入").split()) #默认空格分隔,若要转其他类型,把类型换成需 ...
- Jmeter使用基础笔记-写一个http请求
前言 本篇文章主要讲述2个部分: 搭建一个简单的测试环境 用Jmeter发送一个简单的http请求 搭建测试环境 编写flask代码(我参考了开源项目HttpRunner的测试服务器),将如下的代码保 ...
- UWP入门(二) -- 基础笔记
UWP入门(二) -- 基础笔记 原文:UWP入门(二) -- 基础笔记 不错的UWP入门视频,1092417123,欢迎交流 UWP-04 - What i XMAL? XAML - XML Syn ...
- [云炬创业基础笔记]第五章创业机会评估测试2
[云炬创业基础笔记]第五章创业机会评估测试1
- [云炬创业基础笔记] 第四章测试17
[云炬创业基础笔记] 第四章测试7
- [云炬创业基础笔记] 第四章测试15
[云炬创业基础笔记] 第四章测试7
最新文章
- 比 Spring Boot 快 10 倍的 Bootique 框架
- 0x13.基础数据结构 — 链表与邻接表
- 开发笔记:游戏逻辑模块组织及数据同步
- element中el-upload和vue-cropper结合实现上传头像裁剪大小
- 上班骚扰男同事被抓到......
- 如何加声调口诀_声母韵母口诀顺口溜歌曲(怎么快速记住声母韵母)
- scala初学之Tuple、Array、Map、文件操作入门实战
- 七步从AngularJS菜鸟到专家(6):服务
- azure机器学习_Azure机器学习中的预测
- java.lang.NullPointerException org.apache.jsp.index_jsp._jspInit(index_jsp.java:22)
- python 百度ai json解析_百度AI识别调用的简单例子
- 完整的连接器设计手册_连接器卧式插拔力的测试介绍
- 重庆高清卫星地图(含道路标签数据叠加)
- 模电与数电的基本知识 (学习备用)
- excel浏览器直接下载
- 戴尔笔记本修改硬盘模式为AHCI再安装ubuntu
- windows2008 r2 sp1 启用网络发现设置无法保存的解决办法
- cmd无法进入其他盘符问题解决方案
- 灵活的Vue组件——原来这么简单
- 华为南研所2015年面试经历总结