Unityでキー入力を受ける場合には、普通に実装すると以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void Update() { //Aキーを入力 if(Input.GetKey(KeyCode.A)){ hogehoge.load(); } //Bキーを入力 if(Input.GetKey(KeyCode.B)){ hogehoge.save(); } //Cキーを入力 if(Input.GetKey(KeyCode.C)){ fugafuga.stop(); } } |
しかし、このように1つ1つのスクリプトのUpdate関数内で判定するのは、割り当てられているキーの把握が大変になり、保守性や拡張性が悪くなります。
このような問題を解決するため、今回はキー判定を1つのスクリプトでまとめ、インスペクター側から設定できるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
using System; using UnityEngine; using UnityEngine.Events; public class KeyControllerScript: MonoBehaviour { [Serializable] /// <summary> /// Function definition for a key pressed event /// </sumarry> public class keyEvent: UnityEvent{ public KeyCode key = KeyCode.Return; public keyEvent(){} public keyEvent(KeyCode _keycode) { key = _keycode; } } [SerializeField] private keyEvent keyA = new keyEvent(KeyCode.A); [SerializeField] private keyEvent keyB = new keyEvent(KeyCode.B); [SerializeField] private keyEvent keyC = new keyEvent(KeyCode.C); void Update(){ if(Input.GetKeyUp(keyA.key)){ keyA.Invoke(); } if(Input.GetKeyUp(keyB.key)){ keyB.Invoke(); } if(Input.GetKeyUp(keyC.key)){ keyC.Invoke(); } } } |
このスクリプトをUnityのインスペクター側から見るとこのような感じになっているので、OnClick的な使い方が出来ます。もちろん同時に2つ以上の関数を割り当てることもできます。
キーが増えてくるとごちゃごちゃしてきますが、関数の入れ替えなどもGUI側から行えるのでかなり保守性は上がるかと思います。
実際の使い勝手は不明ですが、このプログラムならば他のプログラムの依存関係が必要ないので、よく使うキーセットのプリセットを作っておけば使いまわすことが出来るので便利だと思います。