【Unity笔记】实现可视化配置的Unity按键输入管理器(按下/长按/松开事件 + UnityEvent绑定)

【Unity笔记】实现可视化配置的Unity按键输入管理器


适用于角色控制、技能触发的Unity按键输入系统,支持UnityEvent事件绑定、长按/松开监听与启用开关

在这里插入图片描述


一、引言

在 Unity 游戏开发中,处理键盘输入是最常见的交互方式之一。尤其是角色控制、技能释放、菜单快捷键等场景,都离不开灵活的按键监听逻辑。

本篇文章将带你实现一个可在 Inspector 中灵活配置的多键位输入监听组件,支持以下功能:

  • 指定任意多个键位;
  • 分别响应按下(GetKeyDown)、长按(GetKey)、松开(GetKeyUp);
  • 每个键位可单独绑定 UnityEvent;
  • 支持启用/禁用某个键位监听。

二、传统写法的局限性

在常规开发中,我们可能会在 Update() 里直接硬编码:

if (Input.GetKeyDown(KeyCode.Space))
{Jump();
}

这种方式虽然简单,但存在问题:

  • 写死在代码中,修改需重新编译;
  • 难以复用或配置多个按键;
  • 不适合非程序人员调试或修改;
  • 不支持动态启用/禁用;
  • 无法响应长按/松开等复合输入。

三、重构目标

我们期望构建一个可配置、可扩展的键盘输入组件:

功能描述
多按键支持可以配置任意数量的键位
UnityEvent绑定可视化绑定任意响应方法
按键状态识别区分按下、长按、松开
启用控制可随时启用/禁用某个键监听
可视化配置非程序人员也能在Inspector中使用

四、核心结构设计

1. 封装键位与事件的类:KeyEventPair
[System.Serializable]
public class KeyEventPair
{public bool isEnabled = true;public KeyCode key;public UnityEvent onKeyDown;public UnityEvent onKey;public UnityEvent onKeyUp;
}

✅ 使用 [System.Serializable] 使其可以在 Inspector 中显示;
✅ 每种事件都使用 UnityEvent,可视化绑定任意函数。


2. 主逻辑组件 KeyPressHandler
public class KeyPressHandler : MonoBehaviour
{public KeyEventPair[] keyEvents;void Update(){foreach (var keyEvent in keyEvents){if (!keyEvent.isEnabled) continue;if (Input.GetKeyDown(keyEvent.key))keyEvent.onKeyDown?.Invoke();if (Input.GetKey(keyEvent.key))keyEvent.onKey?.Invoke();if (Input.GetKeyUp(keyEvent.key))keyEvent.onKeyUp?.Invoke();}}
}

五、使用方法

步骤 1:添加组件

KeyPressHandler 挂载到任意 GameObject 上(推荐创建一个空的 InputManager 物体)。

步骤 2:配置按键事件

在 Inspector 中点击 + 添加键位,并为每个事件(按下、长按、松开)配置方法。

步骤 3:运行测试

运行场景后,在控制台中观察是否正确响应输入。


六、高级用法扩展建议

  • 🔄 支持动态切换键位绑定(例如根据 UI 设置动态换键);
  • ⏱ 记录长按时长,用于充能技能;
  • ⌨ 支持组合键(Ctrl+X、Shift+Space);
  • 📦 制作成 Unity Package 导入项目复用;
  • 🎮 扩展支持手柄输入(使用 Input System);

七、结语

本文介绍了如何构建一个模块化、可视化、支持多状态的键盘输入监听器,极大提高了按键逻辑的灵活性和可维护性。

该组件适用于:

  • 角色控制
  • 技能释放
  • 快捷键触发
  • 编辑器扩展输入监听
  • 非程序人员可视化配置项目输入逻辑

如果你觉得有帮助,欢迎点赞收藏并分享给同行。如果你希望我进一步封装成 Unity 插件或支持新输入系统,也可以留言交流!


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

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

相关文章

Fortran 中使用 C_LOC 和 C_F_POINTER 结合的方法来实现不同类型指针指向同一块内存区域

在 Fortran 中,可以使用 C_LOC 和 C_F_POINTER 结合的方法来实现不同类型指针指向同一块内存区域。以下是具体方法和示例: 关键步骤: 获取内存地址:用 C_LOC 获取原始数组的 C 地址。类型转换:用 C_F_POINTER 将地址转…

Spring Boot整合Kafka的详细步骤

1. 安装Kafka 下载Kafka:从Kafka官网下载最新版本的Kafka。 解压并启动: 解压Kafka文件后,进入bin目录。 启动ZooKeeper:./zookeeper-server-start.sh ../config/zookeeper.properties。 启动Kafka:./kafka-server-…

【含文档+PPT+源码】基于微信小程序的学校体育馆操场预约系统的设计与实现

课程简介: 本课程演示的是一款基于微信小程序的学校体育馆操场预约系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从…

【Leetcode-Hot100】最大子数组和

题目 解答 class Solution(object):def maxSubArray(self, nums):""":type nums: List[int]:rtype: int"""len_nums len(nums)result -1e5left_fit, right_fit 0, len_nums-1if len_nums 1:return nums[0]sum_left, sum_right 0, 0while r…

txt、Csv、Excel、JSON、SQL文件读取(Python)

txt、Csv、Excel、JSON、SQL文件读取(Python) txt文件读写 创建一个txt文件 fopen(rtext.txt,r,encodingutf-8) sf.read() f.close() print(s)open( )是打开文件的方法 text.txt’文件名 在同一个文件夹下所以可以省略路径 如果不在同一个文件夹下 ‘…

硬件电路设计之51单片机(2)

声明:绘制原理图和PCB的软件为嘉立创EDA。根据B站尚硅谷嵌入式之原理图&PCB设计教程学习所作个人用笔记。 目录 一、原理图详解 1、TypeC接口 (1)TypeC接口介绍 (2)TypeC原理图 2、5V转3.3V 3、单片机电源开…

kubernetes 入门篇之架构介绍

经过前段时间的学习和实践,对k8s的架构有了一个大致的理解。 1. k8s 分层架构 架构层级核心组件控制平面层etcd、API Server、Scheduler、Controller Manager工作节点层Kubelet、Kube-proxy、CRI(容器运行时接口)、CNI(网络插件&…

Flink CDC 出现错误码 1236 和 SQL 状态 HY000 的原因及解决方法

Flink CDC 出现错误码 1236 和 SQL 状态 HY000 的原因及解决方法 常见原因 server-id 冲突:当多个 Flink CDC 任务连接同一个 MySQL 实例,且使用了相同的 server-id 时,会导致该冲突。因为 MySQL 服务器通过 server-id 来区分不同的从服务器,如果多个 Flink CDC 任务使用相…

从PPT到PNG:Python实现的高效PPT转图工具

从PPT到PNG:Python实现的高效PPT转图工具 在日常工作中,PPT(PowerPoint)文件是我们常用的演示工具。然而,有时候我们需要将PPT的内容提取为图片格式(如PNG)以便于展示或保存。手动将每一页PPT保…

【开发语言】悬空指针问题

悬空指针(Dangling Pointer)是编程中常见的内存管理问题,尤其在C/C这类手动管理内存的语言中。以下是详细解释: 什么是悬空指针? 悬空指针是指向已经被释放(或失效)内存的指针。这段内存可能已…

【持续更新中】常用docker服务部署指北

前言 docker是个好东西,小树莓派上也能快速部署,方便管理环境。用这篇笔记来记录下各种软件的快速部署方式 准备环境 docker安装 curl -fsSL https://get.docker.com -o get-docker.sh sh ./get-docker.shdocker镜像源配置 一种方法是设置proxy&…

Godot学习-创建简单动画

文章目录 1、准备工作Godot资源 2、创建项目3、创建结点4、创建动画1、创建动画2、添加轨道3、创建关键帧3.1 第一个关键帧3.2 第二个关键帧 5、加载后自动播放6、动画循环7、轨道设置1、轨道更新模式2、轨迹插值3、其他属性的关键帧4、编辑关键帧5、使用 RESET 轨道6、洋葱皮 …

Python 爬虫解决 GBK乱码问题

文章目录 前言爬取初尝试与乱码问题编码知识科普UTF - 8GBKUnicode Python中的编码转换其他编码补充知识GBKGB18030GB2312UTF(UCS Transfer Format)Unicode 总结 前言 在Python爬虫的过程中,我尝试爬取一本小说,遇到GBK乱码问题&a…

B站搜索关键词机制深度解析:算法逻辑与优化策略

在拥有超过5亿用户的B站生态系统中,每天都有海量的视频内容被上传和消费。对于创作者而言,如何让自己的视频在茫茫内容海洋中被目标受众发现,是至关重要的课题。而关键词,正是连接内容与用户的关键桥梁。理解B站的搜索关键词机制&…

宝塔面板中解锁Laravel日志查看的奥秘

目录 一、前言二、Laravel 日志基础认知2.1 日志的作用2.2 Laravel 日志的默认配置 三、查找 Laravel 日志文件位置3.1 常规存储路径3.2 自定义路径查找 四、查看 Laravel 日志内容4.1 宝塔面板文件管理器查看4.2 使用命令行查看 五、常见问题及解决方法5.1 权限不足无法查看5.…

Matlab Add Legend To Graph-图例添加到图

Add Legeng To Graph: Matlab的legend()函数-图例添加到图 将图例添加到图 ,图例是标记绘制在图上的数据序列的有用方法。 下列示例说明如何创建图例并进行一些常见修改,例如更改位置、设置字体大小以及添加标题。您还可以创建具有多列的图…

K8S+Prometheus+Consul+alertWebhook实现全链路服务自动发现与监控、告警配置实战

系列文章目录 k8s服务注册到consul prometheus监控标签 文章目录 系列文章目录前言一、环境二、Prometheus部署1.下载2.部署3.验证 三、kube-prometheus添加自定义监控项1.准备yaml文件2.创建新的secret并应用到prometheus3.将yaml文件应用到集群4.重启prometheus-k8s pod5.访…

基于YOLO11的车牌识别分析系统

【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】系统数据统计与可视化分析支持 【技术栈】 ①:系统环境:Windows/macOS/Linux ②:开发环境:Python 3.8 ③:技术栈&#x…

每天记录一道Java面试题---day39

GC如何判断对象可以被回收了 回答重点 引用计数法: - 每个对象由一个引用计数属性,新增一个引用时计数器加1,引用释放时计数减1,计数为0时可以回收。可达性分析法: - 从GC Roots开始向下搜索,搜索所走过的…

机器学习(5)——支持向量机

1. 支持向量机(SVM)是什么? 支持向量机(SVM,Support Vector Machine)是一种监督学习算法,广泛应用于分类和回归问题,尤其适用于高维数据的分类。其核心思想是寻找最优分类超平面&am…