UE源码分析:Slate 鼠标/触摸输入处理

这篇具有很好参考价值的文章主要介绍了UE源码分析:Slate 鼠标/触摸输入处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

序言

UE4.25版本
本章看一下UE的Slate响应鼠标/触摸的处理,主要是按下、移动、抬起等相关。

输入处理

大致的代码流&堆栈

UE源码分析:Slate 鼠标/触摸输入处理

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

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

UE源码分析:Slate 鼠标/触摸输入处理

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

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

UE源码分析:Slate 鼠标/触摸输入处理

RoutePointerMoveEvent函数

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

当前位置SlatePath的获取

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

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

Route函数
UE源码分析:Slate 鼠标/触摸输入处理

传入的lambda举例
UE源码分析:Slate 鼠标/触摸输入处理

SButton消费输入事件举例
UE源码分析:Slate 鼠标/触摸输入处理

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

其他

UI点击穿透BUG的排查

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

玩家输入堆栈的异步处理

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

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

输入的堆栈
UE源码分析:Slate 鼠标/触摸输入处理

处理时的堆栈
以滑动手势为例
UE源码分析:Slate 鼠标/触摸输入处理

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能正确地接收到鼠标离开的事件。文章来源地址https://www.toymoban.com/news/detail-617532.html

到了这里,关于UE源码分析:Slate 鼠标/触摸输入处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE4蓝图学习篇(七)--处理UMG鼠标穿透

    前提条件:控制器显示鼠标,使用鼠标进行上下左右看。 如图所示,我在UMG中添加了一个新的小界面,当拖动滑动条的时候你会发现我们的界面会跟随鼠标旋转,需要的效果是鼠标在UI区域拖动滑动条的时候,不会对我们的角色进行旋转,而出现在这个问题是因为在UI区域鼠

    2024年02月10日
    浏览(48)
  • 【SA8295P 源码分析】66 - Android 侧内核层 TouchScreen Panel(TP)触摸屏驱动源码分析

    【源码分析】 因为一些原因,本文需要移除, 对于已经购买的兄弟,不用担心,不是跑路, 我会继续持续提供技术支持, 有什么模块想学习的,或者有什么问题有疑问的, 请私聊我,我们 +VX 沟通技术问题,一起学习,一起进步 接下来,我一一私聊已经购买的兄弟添加V

    2024年02月11日
    浏览(51)
  • UE5 多实例像素流之动态调度及处理鼠标偏移

    官方像素流不是一个产品级的解决方案,对于多实例无法支持进程的动态开启与关闭,是通过预先启动的,非常消耗资源。本文通过修改MatchMarker已经信令服务器代码实现。 基本原理 前端页面初始化时请求matchmarker的http服务,后端获取可用的信令服务并将返回信令服务器的地

    2024年02月09日
    浏览(91)
  • UE5.2 LyraDemo源码阅读笔记(五)输入系统

    Lyra里使用了增强输入系统,首先知道增强输入系统里的三个类型配置。 一、Input Actions (IA): 输入操作带来的变量,与玩家的输入组件绑定,回调里驱动玩家行为。 二、InputMappingContext(IMC): 表示一套按键输入配置,让按键与IA绑定,从而使用按键携带的变量驱动IA生效。

    2024年02月12日
    浏览(30)
  • Qt3D 输入类处理鼠标键盘动作

    Qt3D模块中的输入类用于处理用户输入,比如鼠标、键盘等输入事件。 ```cpp #include Qt3DExtras #include Qt3DInput #include Qt3DCore #include Qt3DRender #include Qt3DLogic #include Qt3DExtras int main(int argc, char *argv[]) {     QApplication app(argc, argv);     // 创建Qt3D窗     Qt3DExtras::Qt3DWindow view;     // 创建3

    2024年02月02日
    浏览(29)
  • 在插入鼠标时禁用触摸板,并在没有鼠标时自动启用触摸板。取消勾选连接鼠标时让触摸板保持打开状态,但拔掉鼠标后触摸板依旧不能使用

    设置没问题,但是拔掉鼠标后,触摸板依旧不能使用; 解决方法: 1、检查触摸板:勾选连接鼠标时让触摸板保持打开状态,此时查看触摸板是否正常,如果正常说明触摸板没有问题。 2、禁用虚拟鼠标:按“win”+“x”选择设备管理器 - 鼠标和其他指针设备-通过拔插鼠标判

    2024年02月09日
    浏览(38)
  • ue5,ue4(虚幻5)安卓触摸

    这个是单方向的,如果要用双方向的,就是 x和y同时运用的话建议用向量2d(变量),把它分割成x和y就可以了,我门平时在网上见到的触摸都是:按下到连续,我这个方法是按下-连续-停止,记住,y的变量要是负数,还有就是,灵敏度调大的时候,屏幕会跳动,由于x和y的屏

    2024年02月11日
    浏览(70)
  • [QT/C++]如何得知鼠标事件是由触摸事件转换而来的,使得鼠标触摸事件分离

    依据来源:https://doc.qt.io/qt-5/qml-qtquick-mouseevent.html 具体是在event事件或者mouse系列事件中捕获到鼠标事件后,用如下代码判断鼠标事件是否由触摸事件转换而来的 通过该条件的一律返回,剩下的就是不由触摸事件生成的鼠标事件,由此做到鼠标与触摸事件的分离,使得触摸事

    2024年02月13日
    浏览(33)
  • Android12 部分应用(客户大型游戏)使用鼠标点击无效,鼠标模拟触摸点击

            如标题,在某些较大的游戏应用中,会限制鼠标点击不生效,导致我们的鼠标在系统其他应用上都能使用,就是某个游戏应用无法点击。调试发现,触摸事件不受影响,那么我们可以在当前游戏应用中,点击的时候模拟一下触摸点击,查看是否生效。安卓有一个触摸

    2024年02月02日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包