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 ...
随机推荐
- Java8 Stream流的合并
最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性.比如一个Customer对象,有3个Id:id1,id2,id3,要把这些Id全部取出来,然后去数据库里查询它是否存在. @Da ...
- JS中内存泄漏的几种情况
JavaScript 中的内存泄漏是指程序中使用的内存不再被需要却没有被释放,最终导致浏览器或者 Node.js 进程使用的内存越来越大,直到程序崩溃或者系统运行缓慢. 在 JavaScript 中, ...
- 【asp.net core】自定义模型绑定及其验证
引言 水此篇博客,依旧是来自群里的讨论,最后说到了,在方法参数自定义了一个特性,用来绑定模型,优先从Form取,如果为空,或者不存在,在从QueryString中获取并且绑定,然后闲着无聊,就水一篇博 ...
- Node + Express 后台开发 —— 上传、下载和发布
上传.下载和发布 前面我们已经完成了数据库的增删改查,在弄一个上传图片.下载 csv,一个最简单的后台开发就已完成,最后部署即可. 上传图片 需求 需求:做一个个人简介的表单提交,有昵称.简介和头像. ...
- 2021-02-01:Redis 集群会有写操作丢失吗?
福哥答案2021-02-01: 以下情况可能导致写操作丢失:1.过期 key 被清理.2.最大内存不足,导致 Redis 自动清理部分 key 以节省空间.3.主库故障后自动重启,从库自动同步.4.单 ...
- C++中的字符串编码处理
今天由于在项目中用到一些与C++混合开发的东西 ,需要通过socket与C++那边交换数据,没啥特别的,字节码而已,两边确定一种编码规则就行了.我们确定的UTF-8.关于C++的 这种又是宽字节 又是 ...
- React笔记-生命周期(七)
React笔记-生命周期(七) 生命周期值React组件从装载到卸载的全过程 在这个过程中React提供了多个内置函数供开发者在不同阶段执行需要的逻辑 状态组件由3个阶段组成 挂载阶段(MOUNTIN ...
- vue全家桶进阶之路9:常用指令
以下是一些常见的指令: v-bind - 用于绑定一个或多个属性到组件或 HTML 元素上. v-model - 用于双向绑定一个表单元素或组件的值到数据模型上. v-for - 用于循环遍历一个数组 ...
- es笔记五之term-level的查询操作
本文首发于公众号:Hunter后端 原文链接:es笔记五之term-level的查询操作 官方文档上写的是 term-level queries,表义为基于准确值的对文档的查询,可以理解为对 keyw ...
- Spring 核心概念之一 IoC
前言 欢迎来到本篇文章!通过上一篇什么是 Spring?为什么学它?的学习,我们知道了 Spring 的基本概念,知道什么是 Spring,以及为什么学习 Spring.今天,这篇就来说说 Sprin ...