kotonoha_pcg@気ままに雑記

kotonoha_pcgが気分次第で様々書き置きます.dlang関係他:http://kotonoha-pcg.hatenadiary.com

ゲームパッドの入力(ジョイスティック)を取って移動する

ゲームパッドの入力(ジョイスティック)を取って移動する

 Unityでゲームパッドジョイスティックから入力を取って、オブジェクトの移動をしたいと思ったので試していました。僕の持っているパッドはHORIのEDGE 301で、xinputに対応してるので割と簡単に行けるのでは、と思っていましたが、少し時間がかかったのでメモがてら残しておこうと。

なお、環境は次の通りです。

  • Unity 2020.1.2f1

ボタンの位置の設定

 正直言ってここで少し迷ったんですが、結局ここ()のPicture ReferencesWindows図を見た通りです。

これをmacos用の図じゃないよな・・?と思いながら打ってたのが間違いで迷ってた、という話です…

wiki.unity3d.com

次にUnityのInput Manager(編集→プロジェクト設定)で、次図のように設定していきます。

f:id:kotonoha_pcg:20200816205726p:plain

 この時、名前の項で入力した文字列が、実際にスクリプト内でその入力を使用するためのキーになります。このほかに抑えておけばいいところは(今は)5か所で、それぞれ、

  1. 無効は、入力されたときに実際にそれを反映させるかどうかの、いわゆる閾値を決める。
  2. 反転は、キー入力を反転させるかどうか。
  3. タイプは、操作を受け付けるデバイスが、キーボードかマウスかジョイスティックか、という情報。
  4. 軸は、X軸またはY軸のいずれを使用するか、という情報。
  5. ジョイスティック番号は、使用するジョイスティックが何番目に接続されているものか、という情報。

といった感じ。基本的には、この辺をいじりながら調整していく。これを、X軸だけではなく、Y軸についても同様に設定しておく。

ボタンの入力を取得する

ボタン(というか正確にはジョイスティック)の入力を取得するには、GetKeyDown()やGetAxis()を使う手がある。ただし、ジョイスティックはfloat値を取得する形になるので、GetAxis()を使うことになり、こんな感じで書きます。

float hoge = Input.GetAxis("InputManagerでの「名前」");

実際書いたコードが次の通りです。

float horizontalAxis = Input.GetAxis("Horizontal");
float verticalAxis = Input.GetAxis("Vertical");

//アナログパッドのX/Y軸入力で座標を移動させる
if((Input.GetAxis("Horizontal") != 0f) || (Input.GetAxis("Vertical") != 0f)) {
    player.transform.Translate((horizontalAxis * 0.1f), (verticalAxis * 0.1f), 0);
    Debug.Log("NOW Axis point is: " + horizontalAxis + " and " + verticalAxis);
}

これを、Update()内で回していく形になります。これを移動させるオブジェクトにアタッチして実行すれば、動くようになります。