Ue不消耗輸入

news2024/12/22 23:00:36

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.coloradmin.cn/o/1597916.html

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

相关文章

Vitis HLS 学习笔记--ap_int.h / ap_fixed.h(2)-深度探究

目录 1. 前文回顾 1.1 简单背后的复杂 1.2 复杂性的来源 2. 关键代码 2.1 功能概述 2.2 关系梳理 2.3 理解构造函数二 2.4 理解HLS_CONSTEXPR 2.5 理解const volatile 3. 探究ap_int<8> c&#xff1b;经历了什么 4. 在调试中查看 1. 前文回顾 在《Vitis HLS…

数据安全之路:Databend 用户与角色管理应用

Databend 目前支持基于角色的访问控制 (RBAC) 和 自主访问控制 (DAC) 模型&#xff0c;用于访问控制功能。 通过本指南&#xff0c;我们会了解权限和角色在 Databend 中的基本概念&#xff0c;以及如何管理角色、继承角色与建立层级、设置默认角色以及所有权的重要性。这些功能…

病毒繁殖-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第52讲。 病毒繁殖&#xf…

气象观测站点数据下载与处理

一、下载途径 全国400多个气象站气候数据&#xff08;1942-2022&#xff09; 王晓磊&#xff1a;中国空气质量/气象历史数据 | 北京市空气质量历史数据 气象数据免费下载网站整理 中国气象站观测的气象数据怎么下载 二、R语言处理 2.1 提取站点文件 library(dplyr) library(…

4、XTuner 微调个人小助手(笔记)

视频地址&#xff1a; https://b23.tv/QUhT6ni 课程文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/readme.md 作业文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md 1、Finetune 简介 两种Finetune范式 …

LeetCode_丑数

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

Leetcode-48-旋转图像

题目说明 给定一个 n n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。 说明&#xff1a;你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 示例 1: 给定 matrix [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入…

代码随想录阅读笔记-回溯【全排列】

题目 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路 以[1,2,3]为例&#xff0c;抽象成树形结构如下&#xff1a; 回溯三部曲 1、递归函数参数 首先排列是有…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day 14

Day 14 Classfication (short version) 二分类的时候 用sigmoid 那不就是 logistic 回归嘛&#xff08;softmax 的二分类等价&#xff09; Loss 哦 今天刚学的 &#xff0c;KL散度 &#xff0c;看来cross-entropy 和KL散度是等价的咯~ 我感觉我的直觉没错 这里MSE离得很远的时候…

五、书架开发--5.书架分组功能开发

Dialog和ShelfGroupDialog的基本实现思路&#xff1a; 加入两个组件&#xff0c;一个是Dialog移出分组的弹窗&#xff0c;一个是ShelfGroupDialog&#xff0c;一个是create-api中加入这个ShelfGroupDialog 接下来我们看看这个移动书籍这个对话框的实现原理 如下&#xff0c;用…

Python 标准库functools高阶函数用法

目录 1. partial 用法示例 2. reduce 用法示例 3. total_ordering 用法示例 4. cmp_to_key 用法示例 5. lru_cache 用法示例 6. singledispatch 用法示例 7. update_wrapper 用法示例 8. partialmethod 用法示例 9. singledispatchmethod 用法示例 10. cache 用法示例…

HoloLens2开发时,VS2022的组件和模块配置

HoloLens2开发的时候&#xff0c;VS2022的安装和配置清单&#xff08;有的模块可能不是必须的模块&#xff09; 一、大的模块配置 二、各模块组件的配置

详解运算符重载——探索运算符重载的应用

前言:运算符重载是面向对象的一个重要的知识点。我们都知道内置类型可以进行一般的运算符的运算。但是如果是一个自定义类型&#xff0c; 这些运算符就无法使用了。那么为了解决这个问题&#xff0c; 我们的祖师爷就在c中添加了运算符重载的概念。 本篇主要通过实例——日期类的…

Emacs之增加/取消输入括号自动匹配(一百三十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

安卓apk文件签名

一、环境准备 链接: https://pan.baidu.com/s/1D3WxIL5M5ewyFNTqJzARPw 提取码: pd6w 上篇博文编译的apk文件 1、docker build -t android-build:v1.0.1 . 直接制作镜像 2、docker run -it android-build:v1.0.1 /bin/bash 运行进入容器 指定sdk的路径&#xff0c;然后直接…

AI - 提示词意外收获 (5)

提示词&#xff1a; A soft pink rose with opalescent leaves, located in a surreal desert under the light of a binary star system, The dual shadows and contrasting lights create a dreamlike quality, emphasizing the roses unique beauty,翻译: 一种柔软的粉红…

RESA 车道线检测模型-debug分析

车道线检测模型 RESA 该模型只有一个关键点就是resa模块&#xff0c;把这个想清楚就没什么了&#xff0c;下面看代码 class RESA(nn.Module):def __init__(self, cfg):super(RESA, self).__init__()# self.iter cfg.resa.iter# chan cfg.resa.input_channel# fea_stride c…

绝地求生:PUBG七周年:杜卡迪联动即将到来!

4.13号PUBG官博放出来一个图片让大家猜测是什么东西。 结合之前绝地求生的官方的公告&#xff0c;该载具皮肤毫无疑问就是著名摩托车品牌&#xff1a;杜卡迪。 这篇文章就来简单分析一下本次即将到来的摩托车联动的具体细节。 品牌介绍 杜卡迪&#xff08;Ducati Motor &…

【测试开发学习历程】python常用的模块(中)

目录 5 time模块 5.1、Python中的四种格式的时间&#xff1a; 5.2、time模块中的常用函数 6 I/O流操作 6.1 创建文件 6.2 读取一个文件存入到另外一个文件 6.3 with open as 结构 6.4 open和with open as的区别 7 Excel的操作模块-openpyxl 7.1、新建Excel文件进行读…

PTA 编程题(C语言)-- 判断素数

题目标题&#xff1a; 判断素数 题目作者 陈越 浙江大学 本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;≤ 10&#xff09;&#xff0c;随后N行&#xff0c;每行给出一个小于…