【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.pswp.cn/bicheng/77192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77192.shtml
英文地址,請注明出處:http://en.pswp.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…