首页 > 编程语言 >UE源码分析:Slate 类鼠标输入处理

UE源码分析:Slate 类鼠标输入处理

时间:2023-07-31 11:15:19浏览次数:32  
标签:鼠标 处理 Slate Touch 源码 事件 UE 输入

序言

UE4.25版本
本章看一下UE的 “类鼠标”输入处理(其实就是鼠标和触摸的输入,我也没找到专门的术语来代指,英文UE用的是PointerXXX),主要是按下、移动、抬起等相关的的处理。

输入处理

大致的代码流&堆栈

image

  • FWindowsApplication 是平台层的,处理Windows事件
  • FSlateApplication 是引擎层的核心处理
  • XXXViewport 逐渐过渡到用户层

从玩家操作到引擎处理的大概过程

image

  • 其中RoutePointerXXXEvent中的XXX可能是Down/Moved/Up

以Moved事件处理举例事件路由

image

RoutePointerMoveEvent函数

  • 通知Slate用户事件的开始/完成,以及状态
  • 检查和处理拖拽
  • 检查上一次的事件中一组Slate,对比当前的处理Enter/Leave等逻辑
  • 检查有没有捕获的Slate路径,有的话处理捕获的否则处理当前位置的(二选一)

当前位置SlatePath的获取

所谓SlatePath主要是其一组Slate,这里就是当前(鼠标)位置下,一层层中的Slate。如上图当前位置Slate路径所示,引擎用了类似空间分割的方法,把屏幕分为若干格子,只检查当前位置所在的格子中的slate以优化性能。遍历这些Slate把有效的按照顺序加入数组。

Route函数遍历和事件的“消费”

Route函数
image

传入的lambda举例
image

SButton消费输入事件举例
image

其实这里就是拿到一个Slate路径里的一组Slate一个个的试,如果那一次被处理了,遍历随即结束,用我的话说就是被“消费”了(对应玩家输入事件的生产)。遍历策略如上图示。

其他

UI点击穿透BUG的排查

SButton那里示例了ButtonDown的处理,当没有选择DownAndUp这个Method类型枚举时,没有捕获这个Slate,当拖动手指到其他地方时,Moved事件处理时没有捕获的Slate导致计算当前位置的,响应了移动摄像机的处理,导致UI穿透的错觉。处理方式也很简单,处理摄像机逻辑那块如果没有Start事件进来,Moved事件为不合法不处理。

玩家输入堆栈的异步处理

Viewport得到输入联动到玩家输入时,UPlayerInput::TouchInput方法得到输入不会立刻处理,而是放在堆栈里面等待Tick处理。

Tick时调用UPlayerInput::ProcessInputStack分发给各个模块的委托进行处理。

输入的堆栈
image

处理时的堆栈
以滑动手势为例
image

Slate输入相关的一些概念

聚焦(Focus)

SetFocus是UWidget类里面的方法,最终会调用到FSlateApplication的SetUserFocus方法。SetFoucs顾名思义,就是设置聚焦,当widget获得聚焦或失去聚焦时会触发相关事件 --知乎 日耀水鸡

捕获(Capture)
上面有提到,就是在某些时候(按下Start)锁定某个Slate,方便后续一些操作(如拖拽)使用

模拟触摸(Faking Touch)

在ue4里,鼠标点击和Touch(移动设备的触屏)是两种不同的操作。为了在编辑器下模拟Touch,通常会勾选ProjectSettings里的UseMouseForTouch。这个情况下要想判断是真正的Touch还是模拟的Touch,可以调用FSlateApplication的IsFakingTouchEvents --知乎 日耀水鸡

SlateUser
上面有提到。具体来说,SlateUser代表一个Slate系统的用户,在多用户或多触摸输入的情况下,SlateUser的概念尤为重要。例如,在一个多触摸设备上,可能有多个触摸点同时与屏幕进行交互,这时就需要有多个SlateUser来分别处理每个触摸点的事件。

系统合成事件(Syntetic)
在上述FSlateApplication::RoutePointerMoveEvent中,多次判断了bIsSynthetic是否时合成事件。这里的合成事件是指系统自动产生的事件。例如,当一个Widget被销毁或隐藏时,系统可能会自动产生一个鼠标移动事件,以确保其他Widget能正确地接收到鼠标离开的事件。

标签:鼠标,处理,Slate,Touch,源码,事件,UE,输入
From: https://www.cnblogs.com/hggzhang/p/17588802.html

相关文章

  • VUE el-table表格实现双击编辑,单机空白处放弃修改,回车提交修改
    VUEel-table表格实现双击编辑,单机空白处放弃修改,回车提交修改template<el-row><el-col:span="24"><el-table@cell-dblclick="handleCellDBClick":data="tabledata"border><!--生成列--><......
  • vue2集成simple-mind-map思维导图,实现在线制作思维导图
    1.使用组件组件源码版本licensesimple-mind-map地址0.6.6MIT@toast-ui/editor地址3.1.5MITv-viewer地址1.6.4MITxlsx地址0.18.5Apache-2.0vue-i18n地址8.27.2MIT2.组件结构(部分)3.截图4.示例项目项目一:gitee......
  • vue 环境配置
    根目录下创建.env.env.production.env.development在vite.config.js中使用defineConfig(({mode})=>{constenv=loadEnv(mode,process.cwd());const{VITE_NODE_ENV}=env;})其他地方使用exportconstrequestURL=import.meta.env.VITE_APP_BASE_UR......
  • 谷粒商城项目篇7_分布式高级篇_全文检索ES、商城业务(商品上架)、Feign源码简析
    目录全文检索ESES入门概念Docker安装ES基本操作举栗查询QueryDSL聚合aggregations映射Mapping安装ik分词器安装Nginx,配置远程词库整合SpringBoot新建微服务模块,导入依赖配置使用测试项目中使用场景商城业务商品上架ES的Mapping设计上架代码编写Feign源码封装消息返回R细节问题一、......
  • vue2集成bpmn流程图,可导入导出预览等
    1.使用到的组件组件源码版本licensebpmn-js地址7.3.1bpmn.iobpmn-js-properties-panel地址0.37.2MITcamunda-bpmn-moddle地址4.5.0MIT版本一定要对,否则可能会报错2.组件代码<template><divid="app"><divclass="container">......
  • vue + vite 在index.html中使用环境变量
    npminstallvite-plugin-html-Dvite.config.jsimport{createHtmlPluginasuseHtmlLoader}from'vite-plugin-html'useHtmlLoader({inject:{data:{title:VITE_APP_BASE_URL,},},}),index.html可以使用啦!!!<pclass=&quo......
  • vue2集成tinymce富文本编辑器,添加本地资源解决加载慢问题
     组件源码版本licensetinymce地址4.9.3MIT示例项目一源码地址:gitee1.封装组件<template><div:class="{fullscreen:fullscreen}"class="tinymce-container":style="{width:containerWidth}"><textarea:id="tinymc......
  • vue3
    一、vue3最终响应式原理letperson={name:'张三',age:15,}//我们管p叫做代理数据,管person叫源数据constp=newProxy(person,{//target代表的是person这个源对象,propName代表读取或者写入的属性名get(target,propName){console.log('有人......
  • Vue的学习笔记
    一、弹窗的初始化1.弹窗打开的时候想要对弹窗进行一些初始化数据(比如从表默认选中第一行),可以用@opened绑定方法进行操作,详见:https://element.eleme.cn/#/zh-CN/component/dialog  二、显示与不显示:v-show视频学习地址(03-key,v-show,computed|【入门篇】从零开始学习Vue3核......
  • 无涯教程-jQuery - css( properties )方法函数
    css(properties)方法将键/值对象设置为所有匹配元素的样式属性。css(properties)-语法selector.css(properties)上面的语法可以写成如下-selector.css({key1:val1,key2:val2....keyN:valN})这是此方法使用的所有参数的描述-key:value   - 设置为样式属性......