通常Unityなどを使ってパソコンでゲームを作ると、
ついついキーボードやマウスによる操作を想定したゲームを作ってしまいます。
しかし、最近では、ゲーム好きな人は、
ゲームコントローラー(PS4やSwitchのコントローラーなど)を愛用しており、
それをパソコンにつないで遊ぶのが主流となっています。
ゲームコントローラーは
プロが長年開発し、設計された
完璧な操作感と快適さを兼ね備えているからです。
(FPSはマウスで照準を合わせたいって声もあるけど^^;)
つまり
できるだけ多くのユーザーに遊んでもらいならば、
マウスとキーボードの入力だけでなく、ゲームコントローラーにも対応した
ゲームを設計することが望ましいです。
ただし、そのためにはスクリプトに多くの追記修正が必要になってきます。
そこで活用したいのが、Unityで用意されている(新)Input Systemです。
今後ゲーム開発を行うならば
このInput Systemを当然の如く、利用する習慣をつけておくことをオススメします。
(後から対応は面倒なので、はじめから利用して作っていくべし)
それでは、本記事では、その導入方法を紹介しますが、
その例として、Unity初学者向けの記事で作成したゲームに
Input Systemを適用していきます。
はじめからトレースしたい方は、こちらをご参照ください(簡単です)。
*実は、旧InputSystemでもスティックの入力を検知して動きますが、
コントローラーのその他のボタンの割り当てなどを含めると、どっちみち導入しとくべきです。
1.新Input Systemの導入と設定
まずPackage Managerを開き、カテゴリーをUnity Registryとして、Input Systemを選択します。
Installすると、Warningが出ます。
現在のInput Systemから新たなInut Systemに変えてよいかという質問があります。
「Yes」をクリックします。
もしすでにある程度ゲームを開発していて、新たなInput Systemに置き換えて不具合が出た場合は、
EditタブのProject Settingから、Player_Other Settings_Configuration _Active Input Handlingを設定し直すのが良いでしょう。
(旧式と新式を利用するBothを試してみるのが良いかと)
インストールしたら、Assetsフォルダ内にInputというフォルダを作成します。
そのフォルダの中に、右クリックからInput Actionsを選んで作成します。
PlayerAsset(任意)と名付けたら、そのファイルをダブルクリック。
Input Actionsというタブウィンドウが独立して現れるので、Projetタブと同じところにはめ込みましょう。
それでは、このInput Actionsのタブで作業していきます。
Action Mapsの「+」から、Playerと名付けたファイルを作成、
Actonsの「+」から、
まずは移動の入力キーを設定していくので、Moveと名付けてファイルを作成します。
このゲームプロジェクトのPlayerは、前後左右を(二次元入力で)移動するので、
Moveを選択したら、
ActionTypeを「Value」、Control Typeを「Vector2」に設定します。
なお、Input Actionsの設定した内容は保存しなければいけないので、
忘れちゃう人はAuto-Saveにチェックを入れておきましょう。
ここから移動を行うキーの設定です。
まずは、キーボードの入力を設定します。
Move右横の「+」からAdd Up\Down\Left\Right Compositeクリックし、2D Vector (WASD)という名前にします。
それのUpを選び、Binding PropertiesのPathをクリックして、「Listen」をクリック。
すると、入力されるキーを検出するようになります。
Wキーを押すとW[Keyboard]が出てくるので、クリックします。
これでVector2のUpが、Wキーの入力で可能になりました。
同じ要領で、Down(S)、Left(A)、Right(D)も設定していきますーーー
次に、ゲームコントローラーによる移動の入力を設定していきます。
ゲームコントローラーがある方はパソコンに接続してください。
(筆者はPS4コントローラーを接続して進めます)
Moveの「+」からAdd Bindingをクリック。
そのPathから「Listen」をクリックした上で、ゲームコントローラーの左スティックを動かします。
すると、Left Stick[GamePad]が出るので、選択すればOK。
ここでの移動(Move)に関する設定は以上です。
続いて、本ゲームはSpaceキーでジャンプできるようにしていました。
ゲームコントローラーでもジャンプできるように設定していきます。
Actionsの右横の「+」からNew Actionを作成し、Jumpと名付けます。
そのAction TypeはButtonとします。
まずは、現状通りSpaceキーを当てていきます。
Add Bindingで<No Binding>を作成し、そのPathの「Listen」をクリックした状態でSpaceキーを入力します。
出てきたSpace[Keyboard]を選択します。もう慣れましたね?^^
次はゲームコントローラーです。
Jumpの右横「+」から同じくAdd Bining、Pathの「Listen」をクリックして、
ゲームコントローラーのXボタン(任意)を押します。
するとButton South[GamePad]が出てくるので選択します。
(PS4コントローラーでは、Xボタンは下に位置するボタンなので、Southとなりました)
以上で、Input Actionsタブでの設定は完了です。
Inputフォルダに戻り、PlayerAssetファイルをクリックします。
InspectorがPlayerAssetのものになるので、「Generate C# Class」にチェックを入れて、Applyをクリックします。
すると、PlayerAssetのScriptが自動で作成されます。
これでInput Actionタブで設定した内容をもったクラスができたので、
すでに作ってあるPlayerを動かすスクリプト(PlayerController.cs)を編集して、
このInput Systemの機能を活用できるようにしていきます。
2.既存のスクリプト編集
PlayerControllerを以下のように、追記修正します。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; //追記 public class PlayerController : MonoBehaviour { PlayerAsset playerAsset; //追記 InputAction move; //追記 [SerializeField] float moveSpeed = 10f; [SerializeField] float jumpSpeed = 5f; Rigidbody rb; bool isGrounded; void Awake() { playerAsset = new PlayerAsset(); } private void OnEnable() //追記 { playerAsset.Player.Jump.started += Jump; move = playerAsset.Player.Move; playerAsset.Player.Enable(); } private void OnDisable() //追記 { playerAsset.Player.Jump.started -= Jump; playerAsset.Player.Disable(); } // Start is called before the first frame update void Start() { rb = GetComponent<Rigidbody>(); } // Update is called once per frame void Update() { //方向キーによる移動 // float x = Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed; // float z = Input.GetAxis("Vertical") * Time.deltaTime * moveSpeed; float x = move.ReadValue<Vector2>().x * Time.deltaTime * moveSpeed; //追記 float z = move.ReadValue<Vector2>().y * Time.deltaTime * moveSpeed; //追記 transform.Translate(x,0,z); isGrounded = CheckGround(); //スペースキーによるジャンプ //以下コメントアウト // if (Input.GetKeyDown(KeyCode.Space)) // { // if(isGrounded) // { // isGrounded = false; // rb.AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse); // } // } } //地面を検知する関数 bool CheckGround() { var ray = new Ray(transform.position + Vector3.up * 0.01f, Vector3.down); var distance = 1.5f; return Physics.Raycast(ray, distance); } void Jump(InputAction.CallbackContext obj) //追記 { if(isGrounded) { isGrounded = false; rb.AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse); } } }
OnEnable()はそのオブジェクトが表示されたとき、
OnDisable()は非表示されたときに、読まれる関数です。
ここではPlayerAssetクラスがもつ「Jump」や「Move」を、PlayerControllerクラスで扱えるように紐づけたり、解除したりしていると思ってください。
MoveというValueを返す場合は、move.ReadValue<Vector2>()といったように、
JumpというButtonによって関数を呼ぶ場合は、
void Jump(InputAction.CallbackContext obj){ }として
コーディングすれば、それぞれの機能するようになります。
それでは早速ゲームを実行してみて、
ゲームコントローラーで移動とジャンプができるか試してみてください。
キーボード入力よりも、家庭用ゲーム機を作っている感覚が味わえると思います。
という具合に、みなさんも
ゲーム開発の初期段階からInput systemを導入し、進めていくとよいでしょう~。
以上