Ue不消耗輸入

1、介紹

我們都知道ue裏面使用輸入時,都是在PlayerController裏面進行獲取,

使用官方的操作映射,軸映射,以及目前最新的增强型輸入

但是我們發現了一個問題 那就是輸入會被消耗

就是儅我鼠標按在一個按鈕上時 你另一個地方接受不到此次的輸入

你會覺得很奇怪,我也覺得很奇怪

現在我們需要一個功能 那就是游戲的全局中 我鼠標點擊一下就會有特效

這該怎麽辦呢 一開始我覺得簡單 推送一個監聽事件 監控這所以輸入就好了

但是似乎有問題 他會被按鈕控件這些給消耗掉輸入 我們猜想他應該第一個接受到輸入才對啊

所以現在我們需要能第一個接受到輸入的地方

ue裏面似乎已經有了

class IInputProcessor 類

2、大致調用流程

ue似乎是在此處集中處理輸入的

我們從

UE_5.0\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp

int32 FWindowsApplication::ProcessDeferredMessage( const FDeferredWindowsMessage& DeferredMessage ) 函數開始看起

我們就看按鍵按下時 2218行

MessageHandler->OnMouseDown( CurrentNativeEventWindowPtr, MouseButton, CursorPos );

请添加图片描述

MessageHandler 是FGenericApplicationMessageHandler類型的 一個 共享指針

请添加图片描述

FGenericApplicationMessageHandler 内部基本都是虛函數 一看是虛函數我們就應該知道 他主要是看子類來實現的了

请添加图片描述

FSlateApplication 類是一個繼承自 FGenericApplicationMessageHandler

Slate ue自己封裝的一個UI框架(大概 我不是很懂 我目前只是做筆記狀態

请添加图片描述

我們看到他將OnMouseDown虛函數重寫了

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我們看到這裏繼續傳遞 還傳遞了一個Lambda函數 使用參數類型為

IInputProcessor 進行調用 IInputProcessor::HandleMouseButtonDownEvent在这里插入图片描述

在这里插入图片描述

這裏我們注意到了 調用返回了一個返回值 bool 類型

為true就跳出 不再往下循環調用的 IInputProcessor 的事件了

這裏意味著什麽呢?我們只要能將我們自己IInputProcessor類加入 InputPreProcessorList 中 我們就有機會是第一時間處理輸入的

最後也是返回這個 返回值

在这里插入图片描述

我們的 IInputProcessor
在这里插入图片描述

好了現在我們需要看看調用最初的位置了

在这里插入图片描述

假如我們這裏返回true了就跳出了 不在向下執行了

我們看看下面是什麽

在这里插入图片描述

我們似乎看到了一個眼熟的東西

InMouseCaptorWidget.Widget->OnPreviewMouseButtonDown(InMouseCaptorWidget.Geometry, Event);

OnPreviewMouseButtonDown函數

我們似乎在UserWidget裏面也看到過

在这里插入图片描述

但是這裏的這個是 SWidget裏面的

在这里插入图片描述

是個虛函數 所以現在我們要有一個猜想 UserWidget是否是繼承這個SWidget的?

很可惜並沒有

但是我找到了另一個東西

SObjectWidget 有繼承 SWidget 且重寫了這個函數

在这里插入图片描述

WidgetObject

在这里插入图片描述

看到了是什麽呢? 是UserWidget !!!在这里插入图片描述

我們找到了

現在看到他傳遞過來了

所以我們在 IInputProcessor 中處理輸入一定比UI快一步拿到

在这里插入图片描述

在这里插入图片描述

我們看到鼠標點擊和觸摸點擊是同時處理的

在这里插入图片描述

在这里插入图片描述

流程大概我也只會這裏了

3、使用自己定義的 IInputProcessor 進行處理輸入

首先先定義一個繼承 IInputProcessor 類的類型 FInputHelp_Ysp

在这里插入图片描述

然後將所以 IInputProcessor 中 的虛函數全部重寫 且全返回為false

爲何返回false? 看這裏 爲了不住儅向下處理

在这里插入图片描述

比如我們想處理鼠標按鍵事件

首先我們使用DECLARE_DELEGATE_OneParam 宏 靜態單播代理

DECLARE_DELEGATE_OneParam(FOnInputProcessorMouseButtonEvent, const FPointerEvent&);

在这里插入图片描述

`bool FInputHelp_Ysp::HandleMouseButtonDownEvent(FSlateApplication& SlateApp, const FPointerEvent& MouseEvent)
{
OnInputMouseButtonEvent.ExecuteIfBound(MouseEvent);

GEngine->AddOnScreenDebugMessage(-1, 2, FColor::Blue, MouseEvent.GetEffectingButton().ToString());return false;

}`

ok 這樣這個類就寫完了

現在我們造一個 **APlayerController **類

ASMPlayerController類

在这里插入图片描述

`void ASMPlayerController::BeginPlay()
{
Super::BeginPlay();

InputHelp = MakeShareable(new FInputHelp_Ysp());//注册输入
if (InputHelp)
{FSlateApplication::Get().RegisterInputPreProcessor(InputHelp);FPointerEvent MouseEvent;//绑定鼠标或触摸按下/抬起InputHelp->OnInputMouseButtonEvent.BindLambda(//this,[this](const FPointerEvent& MouseEvent){GEngine->AddOnScreenDebugMessage(-1, 2, FColor::Red, MouseEvent.GetEffectingButton().ToString());this->MouseBottonEvent(MouseEvent);});//	BindUObject(this, &ASMPlayerController::MouseBottonEvent);//绑定鼠标/触摸 移动InputHelp->OnInputMouseMoveEvent.BindLambda([this](const FPointerEvent& MouseEvent){GEngine->AddOnScreenDebugMessage(-1, 2, FColor::Red, MouseEvent.GetScreenSpacePosition().ToString());this->MouseMoveEvent(MouseEvent);});}

}`

在这里插入图片描述

在这里插入图片描述

*MakeShareable **函數幹嘛的呢?

說是一個共享指針包裝器

可以容納一個對象的指針

TSharedPtr<FInputHelp_Ysp> InputHelp;

總得來説就是爲了將普通轉換成共享指針的

我們還需要取消注冊

在这里插入图片描述

在这里插入图片描述

你們可能好奇我爲什麽不使用動態單播

因爲我寫的那個 **FInputHelp_Ysp **用不了

我猜想應該是我沒有使用到反射 ue 有個反射頭文件 不太清楚 也可能是沒有繼承UObject

4、藍圖方面

在这里插入图片描述

在这里插入图片描述

在重寫函數裏面找到我們所寫的 MosueBottonEvent 函數

然後從中處理邏輯就好

比如跟隨鼠標 移動一張圖片

在这里插入图片描述

好了述説解釋
個反射頭文件 不太清楚 也可能是沒有繼承UObject
好了述説結束

知乎大佬
https://zhuanlan.zhihu.com/p/336178531

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elastic安装后 postman对elasticsearch进行测试

一、创建索引和mapping //id 字段自增id //good_sn 商品SKU //good_name 商品名称 //good_introduction 商品简介 //good_descript 商品详情 PUT http://IP:9200/shop { "mappings":{ "good":{ "properties":{ …

LabVIEW光学探测器板级检测系统

LabVIEW光学探测器板级检测系统 特种车辆乘员舱的灭火抑爆系统广泛采用光学探测技术来探测火情。光学探测器作为系统的关键部件&#xff0c;其探测灵敏度、响应速度和准确性直接关系到整个系统的运行效率和安全性。然而&#xff0c;光学探测器在长期使用过程中可能会因为灰尘污…

牛客Linux高并发服务器开发学习第一天

Linux开发环境搭建 安装Xshell 7远程连接虚拟机的Ubuntu 安装Xftp 7可以传输文件(暂时还没使用) 安装VMware Tools可以直接从Windows系统向虚拟机Linux系统拖拽文件实现文件交互。 安装CScode可以远程连接Linux系统进行代码的编写。&#xff08;Windows系统与Linxu系统公钥…

ActiveMQ 任意文件上传漏洞复现

一、使用弱口令登陆 ​ 访问 http://ip:8161/admin/ 进入admin登陆页面&#xff0c;使用弱口令登陆&#xff0c;账号密码皆为 admin&#xff0c;登陆成功后&#xff0c;headers中会出现验证信息 ​ 如&#xff1a; Authorization: Basic YWRtaW46YWRtaW4 # 二、利用PUT协议上…

STL体系结构与各容器基本介绍

STL体系结构与各容器基本介绍 STL体系结构基本容器序列式关联式&#xff08;查找更快&#xff09;其他&#xff08;不常用&#xff09;使用分配器 STL体系结构 六大模块 容器算法迭代器适配器仿函数分配器 基本容器 序列式 array c11新标准array<类型&#xff0c;大小&…

Linux-管道

目录 无名管道关闭未使用的管道文件描述符 管道对应的内存大小与shell命令进行通信&#xff08;popen&#xff09;命名管道FIFO创建FIFO文件打开FIFO文件 无名管道 管道是最早出现的进程间通信的手段。 管道的作用是在有亲缘关系的进程之间传递消息。所谓有亲缘关系&#xff…

MySQL中的SQL高级语句[二]

使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法&#xff0c;看完代码自己敲一遍&#xff0c;十分有用 拖动表名到查询文件中就可以直接把名字拉进来以下是使用脚本方法&#xff0c;也可以直接进行修改中括号&#xff0c;就代表可写可不写 有些地方的代…

IO——标准IO

1.1概念 标准IO&#xff1a;是在C库中定义的一组专门用于输入输出的函数。 1.2特点 &#xff08;1&#xff09;通过缓冲机制减少系统调用&#xff0c;提高效率 &#xff08;2&#xff09;围绕流操作&#xff0c;用FILE*描述 &#xff08;3&#xff09;标准IO默认打开三个流&a…

PCIe错误定义与分类

前言&#xff1a; PCI总线中定义两个边带信号&#xff08;PERR#和SERR#&#xff09;来处理总线错误。其中PERR#主要对应的是普通数据奇偶校检错误&#xff08;Parity Error&#xff09;&#xff0c;而SERR#主要对应的是系统错误&#xff08;System Error&#xff09;。具体如下…

数据结构复习指导之绪论(算法的概念以及效率的度量)

文章目录 绪论&#xff1a; 2.算法和算法评价 知识总览 2.1算法的基本概念 知识点回顾与重要考点 2.2算法效率的度量 知识总览 1.时间复杂度 2.空间复杂度 知识点回顾与重要考点 归纳总结 绪论&#xff1a; 2.算法和算法评价 知识总览 2.1算法的基本概念 算法( Al…

【现代C++】模块的使用

C20引入了模块的概念&#xff0c;这是一个重要的新特性&#xff0c;旨在替代传统的预处理器和头文件机制。模块旨在提高编译速度、改善代码封装性、减少名称污染&#xff0c;并提供更好的工具支持。下面详细介绍模块的关键概念和使用方法&#xff1a; 1. 模块的基本概念 模块…

openGauss学习笔记-263 openGauss性能调优-TPCC性能调优测试指导-前置软件安装

文章目录 openGauss学习笔记-263 openGauss性能调优-TPCC性能调优测试指导-前置软件安装263.1 安装jdk263.2 安装numactl263.3 安装ant263.4 安装htop工具 openGauss学习笔记-263 openGauss性能调优-TPCC性能调优测试指导-前置软件安装 本章节主要介绍openGauss数据库内核基于…

谷歌浏览器的开发者插件vue-devtools

在这里我留下一个git地址用来下载插件包&#xff0c;首先在自己喜欢的位置创建一个新的文件夹&#xff0c;起一个自己喜欢的文件夹名字&#xff0c;下载到包后&#xff0c;然后点进文件夹里下载依赖&#xff0c;npm install,下载后如下面这个样子 git clone https://gitee.com…

【投稿优惠-EI稳定检索】2024年人工智能、自然语言处理与机器学习国际会议(ICAINLPML 2024)

2024 International Conference on Artificial Intelligence, Natural Language Processing and Machine Learning (ICAINLPML 2024) 网址&#xff1a;www.icainlpml.com 邮箱: ainlpmlsub-conf.com ●会议简介 2024年人工智能、自然语言处理与机器学习国际会议将邀请全球人…

Jackson 2.x 系列【24】Spring Web 集成

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. Spring Web3. Jackson2ObjectMapperBuilder4. Jackson2ObjectMapperFa…

比例控制器H5773282、H8135950、H3390627、H6079948

名称&#xff1a;BEUEC数字比例放大器、伺服比例控制器、伺服比例阀放大板&#xff0c;订货代号&#xff1a;H5773282、H8135950、H3390627、H6079948、H6108848、H6700353、H8851035、H1688388、H9549313、H3264103、H1182967&#xff0c;输入指令可选10V、4-20mA&#xff0c;…

Session缓存、Hibernate处理对象的状态了解

Session接口 Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口&#xff0c;它提供了基本的保存&#xff0c;更新&#xff0c;删除和查询的方法。 Session是有一个缓存, 又叫Hibernate的一级缓存 session缓存是由一系列的Java集合构成的。当一个对象被加入到…

[大模型]Atom-7B-Chat 接入langchain搭建知识库助手

Atom-7B-Chat 接入langchain搭建知识库助手 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置…

Linux 网络测速

1.开发背景 网络测速&#xff0c;为了测试开发板的网络速度是否达标的通用测试方法 2.开发需求 搭建 iperf3 &#xff0c;在 ubuntu 下安装服务端&#xff0c;在板卡上安装客户端&#xff0c;服务端和客户端互发 3.开发环境 ubuntu20.04 嵌入式开发板&#xff08;debian 千…

LeetCode_丑数

题目&#xff1a; 题解&#xff1a; 由题&#xff0c;我们知道丑数大于0&#xff0c;丑数都可以写成2*2*...*2*3*3...*3*5*5...*5&#xff0c;有了这个基础就很好写代码了。 用三个while循环将前面的2 3 5全部除掉如果这个数是丑数&#xff0c;最后n是等于1的&#xff0c;反之…