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

- FWindowsApplication 是平台层的,处理Windows事件
- FSlateApplication 是引擎层的核心处理
- XXXViewport 逐渐过渡到用户层
从玩家操作到引擎处理的大概过程

- 其中
RoutePointerXXXEvent中的XXX可能是Down/Moved/Up
以Moved事件处理举例事件路由

RoutePointerMoveEvent函数
- 通知Slate用户事件的开始/完成,以及状态
- 检查和处理拖拽
- 检查上一次的事件中一组Slate,对比当前的处理Enter/Leave等逻辑
- 检查有没有捕获的Slate路径,有的话处理捕获的否则处理当前位置的(二选一)
当前位置SlatePath的获取
所谓SlatePath主要是其一组Slate,这里就是当前(鼠标)位置下,一层层中的Slate。如上图当前位置Slate路径所示,引擎用了类似空间分割的方法,把屏幕分为若干格子,只检查当前位置所在的格子中的slate以优化性能。遍历这些Slate把有效的按照顺序加入数组。
Route函数遍历和事件的“消费”
Route函数

传入的lambda举例

SButton消费输入事件举例

其实这里就是拿到一个Slate路径里的一组Slate一个个的试,如果那一次被处理了,遍历随即结束,用我的话说就是被“消费”了(对应玩家输入事件的生产)。遍历策略如上图示。
其他
UI点击穿透BUG的排查
SButton那里示例了ButtonDown的处理,当没有选择DownAndUp这个Method类型枚举时,没有捕获这个Slate,当拖动手指到其他地方时,Moved事件处理时没有捕获的Slate导致计算当前位置的,响应了移动摄像机的处理,导致UI穿透的错觉。处理方式也很简单,处理摄像机逻辑那块如果没有Start事件进来,Moved事件为不合法不处理。
玩家输入堆栈的异步处理
Viewport得到输入联动到玩家输入时,UPlayerInput::TouchInput方法得到输入不会立刻处理,而是放在堆栈里面等待Tick处理。
Tick时调用UPlayerInput::ProcessInputStack分发给各个模块的委托进行处理。
输入的堆栈

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

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能正确地接收到鼠标离开的事件。
UE源码分析:Slate 类鼠标输入处理的更多相关文章
- Struts2 源码分析——DefaultActionInvocation类的执行action
本章简言 上一章讲到关于拦截器的机制的知识点,让我们对拦截器有了一定的认识.我们也清楚的知道在执行用户action类实例之前,struts2会先去执行当前action类对应的拦截器.而关于在哪里执行a ...
- Struts2 源码分析——Result类实例
本章简言 上一章笔者讲到关于DefaultActionInvocation类执行action的相关知识.我们清楚的知道在执行action类实例之后会相关处理返回的结果.而这章笔者将对处理结果相关的内容 ...
- tornado框架源码分析---Application类之debug参数
先贴上Application这个类的源码. class Application(httputil.HTTPServerConnectionDelegate): """A ...
- LinqToDB 源码分析——DataContext类
LinqToDB框架是一个轻量级的ORM框架.当然,功能上来讲一定比不上Entity Framework的强大.但是在使用上总让笔者感觉有一点Entity Framework的影子.笔者想过可能的原因 ...
- yii2 源码分析Action类分析 (六)
Action类是控制器的基类, <?php namespace yii\base; use Yii; /** * Action是所有控制器动作类的基类,它继承组件类 * * 动作提供了重用动作方 ...
- yii2 源码分析 model类分析 (五)
模型类是数据模型的基类.此类继承了组件类,实现了3个接口 先介绍一下模型类前面的大量注释说了什么: * 模型类是数据模型的基类.此类继承了组件类,实现了3个接口 * 实现了IteratorAggreg ...
- yii2 源码分析 object类分析 (一)
转载请注明链接http://www.cnblogs.com/liuwanqiu/p/6737327.html yii2基本上所有的类都是继承的object类,下面就来分析一下object类吧 obje ...
- yii2 源码分析Behavior类分析 (四)
Behavior类是所有事件类的基类,它继承自object类 Behavior类的前面注释描述大概意思: * Behavior类是所有事件类的基类 * * 一个行为可以用来增强现有组件的功能,而不需要 ...
- yii2 源码分析Event类分析 (三)
转载请注明链接:http://www.cnblogs.com/liuwanqiu/p/6739880.html Event是所有事件的基类,它继承Object类 Event类上面的注释的大致意思: * ...
- yii2 源码分析 Component类分析 (二)
转载请注明链接http://www.cnblogs.com/liuwanqiu/p/6739538.html 组件(component),是Yii框架的基类,实现了属性.事件.行为三类功能,它集成自o ...
随机推荐
- [OpenCV-Python] 14 几何变换
文章目录 OpenCV-Python:IV OpenCV中的图像处理 14 几何变换 14.1 扩展缩放 14.2 平移 14.3 旋转 14.4 仿射变换 14.5 透视变换 OpenCV-Pyth ...
- Python-解三元一次方程
需要解的方程组为: x + y + z = 26 x - y = 1 2x - y + z = 18 下面进入代码实现: 1.导入数学计算库 numpy import numpy as np 2.生成 ...
- count(列名)、count(1)和 count(*)有什么区别?
在MySQL中,这几个都是统计操作,很多人在使用的时候,都使用的是count(1),这有没有问题?使用正确?达到了统计效果? 我们从效果和效率两方面来分析下 执行效果 count(*) 包括了所有的列 ...
- 【python爬虫】对于微博用户发表文章内容和评论的爬取
此博客仅作为交流学习 对于喜爱的微博用户文章内容进行爬取 (此部分在于app页面进行爬取,比较方便) 分析页面 在这里进行json方法进行,点击Network进行抓包 发现数据加载是由这个页面发出的, ...
- STL------sort三种比较算子定义
sort的三种比较算子的定义方式 例:一道细碎的细节模拟题: http://newoj.acmclub.cn/contests/1258/problem/3 1932: 2018蓝桥杯培训-STL应用 ...
- 2023-03-14:读取摄像头,并且显示视频。代码用go语言编写。
2023-03-14:读取摄像头,并且显示视频.代码用go语言编写. 答案2023-03-14: 大体流程如下: 导入所需的库和包. 初始化 ffmpeg 和 SDL2 库. 打开摄像头并创建 AVF ...
- 2022-11-20:小团生日收到妈妈送的两个一模一样的数列作为礼物! 他很开心的把玩,不过不小心没拿稳将数列摔坏了! 现在他手上的两个数列分别为A和B,长度分别为n和m。 小团很想再次让这两个数列变
2022-11-20:小团生日收到妈妈送的两个一模一样的数列作为礼物! 他很开心的把玩,不过不小心没拿稳将数列摔坏了! 现在他手上的两个数列分别为A和B,长度分别为n和m. 小团很想再次让这两个数列变 ...
- vue-admin-template包下载地址
https://gitee.com/panjiachen/vue-admin-template/ https://github.com/PanJiaChen/vue-admin-template
- 快速上手kettle(二)小试牛刀
目录 一 .前言 二 .两个小目标 三. kettle核心概念介绍 3.1 转换 3.1.1 步骤(Step) 3.1.2 跳(Hop) 3.1.3 元素据 3.1.4 数据类型 3.1.5 并发执行 ...
- 【python基础】复杂数据类型-列表类型(排序/长度/遍历)
1.列表数据元素排序 在创建的列表中,数据元素的排列顺序常常是无法预测的.这虽然在大多数情况下都是不可避免的,但经常需要以特定的顺序呈现信息.有时候希望保留列表数据元素最初的排列顺序,而有时候又需要调 ...