針對版本2018.4 LTS與Input System 0.2.1。
Unity看起來有兩套負責處理用戶輸入的系統,一套是Input Manager,另外一套是一直在維護與開發的Input System,現在的版本是1.0。但是如果倘若跟我一樣需要修改老的Unity工程,很有可能還是用了老版本的Input System。本文給Unity初學者展示如何使用Input System處理外部按鍵輸入,進而處理游戲邏輯。
首先點擊編輯器菜單Window下Package Manager,確認Input System已經安裝。這里使用的是老版本的0.2.1,從Unity網站上直接下載即可。

接下來解釋如何定義按鍵。
當使用了Input System之后,在Project工程目錄內的某個文件夾內點擊鼠標右鍵,可以看到我們可以創建一個Input System。

而后輸入一個名字,我們的一個輸入系統就創建好了。
這里需要解釋一下,一個游戲可以有多個輸入系統。每一個輸入系統只是定義了ActionMap和按鍵的映射,和游戲本身邏輯無關,所以許多時候,如果游戲存在多個不同的場景,那么顯然為了區分起見可以創建多個輸入系統,這樣游戲邏輯處理起來會簡單,以及更有條理一些。
繼續工作。在Inspector面板內,點擊Edit asset,就開始定義ActionMap和按鍵的映射。

這里我們定義了一個WarriorConfig和MagicanConfig,分別對應了戰士和魔法師的動作,這里對於戰士,我們對應了兩種攻擊方式,普通攻擊和快速攻擊,按鍵是f和s。

然后一定要點Save Asset,這樣這個Unity Asset就存儲了這一套規則。
點擊Generate C# Class之后,填好生成的C#文件路徑和類名,點擊Apply,這樣其C#文件就生成了。

下面開始為游戲對象添加Script,假如場景里有個十字弓Crossbow的腳本文件,當我們要處理按鍵與十字弓動作的關系的時候,需要先定義好對應Input System的成員變量。范例代碼如下。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Experimental.Input; public class Crossbow : MonoBehaviour { // Declare the skill controls. [Space] [SerializeField] private SkillControls skilControls; void Update() { } }
隨后,回到Inspector,可以看到暴露出的成員

可以直接從Project拖拽對應的Asset到成員。這里我定義了2套控制,可以看出這一套系統是可以很方便的實現對控制的解耦合。
下面用簡單的代碼演示如何在腳本中處理按鍵事件。
public class Crossbow : MonoBehaviour { [Space] [SerializeField] private SkillControls skillControls; void Awake() { var normalAttack = skillControls.WarriorConfig.NormalAttack; normalAttack.Enable(); normalAttack.performed += OnNormalAttack; } public void OnNormalAttachk(InputAction.CallbackContext ctx) { Debug.LogWarning("Normal Attack!"); } }
從Awake方法中可以直接獲得所有定義的按鍵事件組合,然后把對應的處理函數交給performed以及cancelled處理。這樣就完成了。
需要注意的是,這種方法需要先Enable對應的InputAction,否則不會工作。
是不是很簡單?
