【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 插件或支持新輸入系統,也可以留言交流!