今回は今までキーボードとマウス操作で動かしていたキャラクターをPS3コントローラー(ゲームパッド)で動かせるように対応していきます。
わたくしの場合はパソコン用のゲームコントローラーを持っていないのでPS3コントローラーを使いますが、パソコン用のゲームコントローラーを持っていればそちらで対応した方が早いです。
なぜならパソコン用のゲームコントローラーがどの番号のボタンに対応しているかを確認し、UnityのInput Managerに設定するだけだからです。
前回は
で銃を撃った時のエフェクトを加えました。
PS3コントローラーをパソコンで使う
PS3コントローラーをパソコンで使用するには対応する為のソフトが必要になります。
その辺は
を参照してソフトのダウンロードと設定を行ってください。
今繋いでいるPS3コントローラーやパソコンゲーム用のコントローラーのジョイスティックやボタンが何番に対応しているかは
Windows7ならスタートメニュー→デバイスとプリンター→ゲームコントローラーのアイコン上で右クリック→ゲームコントローラーの設定→プロパティで見る事が出来ます。
↑がデバイスとプリンターの画面でPS3コントローラーのアイコンが表示されているので右クリックしてゲームコントローラー設定を選択します。
パソコンに繋いでいるゲームコントローラーの設定を選択しプロパティを押します。
↑のようなウインドウが開くのでゲーム用コントローラーを操作し、ジョイスティックを動かすとどこが動くか?どのボタンを押したら何番のボタンが反応するかを見て、
Better DS3の設定とUnityでのInput Managerの設定をしていってください。
パソコン用コントローラーを持っている人はジョイスティックを動かして反応するか、ボタンを押した時に番号が光るかを確認しUnityのInput Managerに設定をします。
FPSゲームの操作と対応するボタンを考える
パソコン用コントローラーの場合DirectInputとXInputの2通りの入力方法があるので自分が対応したいボタンとUnityの設定が合うようにする必要があります。
現在ではXInputの対応が主流なんですかね?
パソコンコントローラーがどちらで対応しているかによって若干変わりますが、UnityではInput Managerの設定で対応するボタンを変えるだけなので簡単です。
今回はPS3コントローラーのジョイスティックやボタンでキャラクターがどう動くかを考えていきます。
まずは今出来るキャラクターの動作は
の動作です。
FPSを作ってみようなんてカテゴリを作りゲーム制作をしていますが、わたくし自身はTPSはやってもFPSはコールオブデューティぐらいしかやったことがありません(^_^;)
なので、通常のFPSゲームのボタン操作がどうなっているかわかりませんのでとりあえず適当に設定してみます。
歩く動作は左のジョイスティックで前後左右に動くように対応します。
走る動作はキーボードの左シフトキーを押しながらキーボードの上下左右のキーで走らせていたので、コントローラーでは×ボタンを押しながら左のジョイスティックで移動させたら走るようにします。
視点の変更とキャラクターの回転は右スティックで回転出来るようにします。
銃を構えるのはR1ボタンを押した時に構えるようにしましょう。
銃を撃つのは構えている時に□ボタンを押した時にします。
ジャンプは○ボタンを押した時にします。
今回の設定で実際に動かしてみましたが、走りながら構えて視点変更しながら撃つのは非常に難しいですね・・・。
走る動作を左スティックボタンを押しながら倒すと走る動作にした方がいいのかも?
操作方法の対応はご自分の設定したい方法に変更してください。
UnityのInput Managerの設定
コントローラーのボタン対応を確認したらUnityのInput Managerの設定をしていきます。
UnityのメニューからEdit→Project Settings→Inputを選択します。
左スティックやボタンの対応は
を見ながらゲーム用コントローラーの番号と対応させていってください。
例として走る動作の設定をします。
↑のようにRunに対応するのはleft shift(左のシフトキー)を押した時とjoystick button 14を押した時に対応しています。
PS3の×ボタンが番号15に対応しておりUnityのInput Managerでは1を引いたボタンを設定します。
これでスクリプトに
Input.GetButtonDown(“Run”)
と記述すれば左のシフトキーか×ボタンを押した時に条件がtrueになります。
他の動作も同じように設定していきますが、視点とキャラクターの角度の変更動作である右スティックの対応が解り辛いので画像を使って説明します。
まずキャラクターの回転はRightLeftを作り、視点の上下はUpDownを作り設定します。
DirectInputの場合は右スティックの左右押しはAxisを3rd axisに設定し、上下押しは5th axisに対応しているようです。
その為TypeをJoystick Axisにし、Axisをそれぞれ変更します。
XInputでの入力の場合、右スティックの左右は4th axis、上下押しは5th axisに対応しているようです。
わたくしの場合PS3コントローラーなのでパソコン用のゲームコントローラーでどのようになるかはわかりませんので確認してください(^_^;)
これでゲーム用コントローラーとUnityのInput Managerの設定が終わりました。
ゲームパッド対応の為のキャラクター操作スクリプトの修正
キャラクターの操作をゲームコントローラーに対応させた事でいくつか修正をする必要があります。
視点の変更やキャラクターの回転をさせていたのはマウスを動かした時でInput.GetAxis(“Mouse X”)とInput.GetAxis(“Mouse Y”)を使用していました。
この部分をInput.GetAxis(“RightLeft”)とInput.GetAxis(“UpDown”)に書き換えます。
MyCharaの該当する部分を修正します。
1 2 3 4 |
yRotate = Input.GetAxis ("RightLeft") * cameraSpeed * Time.deltaTime; xRotate = Input.GetAxis("UpDown") * cameraSpeed * Time.deltaTime; |
↑のような感じで書き換えるだけです。
単純に書き換えてしまったのでマウスでの視点変更が出来なくなります。
マウス操作も以前と同じようにしたい場合はInput ManagerのMouse X、Mouse Yと同じ設定のRightLeft、UpDownを作成します。
ゲームパッドの設定のRightLeft、UpDownとマウス操作のRightLeft、UpDownを2つずつ作成しておけばどちらでも動作します。
これでゲームパッドの対応が完了しました!
以前の記事で視点の変更、キャラクターの回転の処理がうまく働いていない部分があったので、
も確認し修正してください。
キャラクター操作処理の変更
キーボードとマウス操作でキャラクターを動かしていた時は操作が大変であまり気付かなかった事ですが、キャラクターがジャンプ中に銃を構えたり撃つ事が出来ませんでした。
また、銃を構える途中で銃を撃つボタンを押すと銃を撃つアニメーションに切り替わっていました。
そこを修正していきます。
まずはMyCharaスクリプトを修正します。
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 |
// 銃を構える if(Input.GetButton("Fire2")) { // waitShot = true; animator.SetBool("WaitShot", true); } else { waitShot = false; animator.SetBool("WaitShot", false); } // 銃を撃つ if(waitShot && Input.GetButtonDown("Fire1") && !animator.GetCurrentAnimatorStateInfo (animator.GetLayerIndex("UpperBody")).IsName ("Shot") && !animator.IsInTransition(animator.GetLayerIndex("UpperBody")) ) { shot.Judge(); animator.SetBool("Shot", true); } velocity.y += Physics.gravity.y * Time.deltaTime; cCon.Move(velocity * Time.deltaTime); // キャラクターコントローラのMoveを使ってキャラクターを移動させる } public void SetWaitShot () { waitShot = true; } |
銃を構える、銃を撃つという処理がcCon.isGroundedの条件下にありますが、それを切り取りキャラクターをMoveで動かしている処理の上に移動します。
これでキャラクターが地面に接地していなくても銃を構え、撃つ事が出来ます。
またSetWaitShotメソッドを定義し外部からwaitShotをtrueに出来るようにします。
銃を構えるボタンを押したらwaitShotをtrueにしていた部分(コメントにしてある部分)を削除してください。
銃を構えるボタンを押していたら銃を構え終わっていなくても銃を撃つ事が出来ていたので銃を構えるボタンを押しただけではしないようにします。
そしてアニメーションイベントを使用してSetWaitShotメソッドを呼び出しwaitShotをtrueにするようにします。
アニメーションイベントに関しては
を参照してください。
銃を構えるアニメーションにアニメーションイベントを設定します。
銃を構えるアニメーションを選択し下の方にあるEventsを押します。
銃を構え終わる途中にイベントを作成します。
↑のようなウインドウが開くのでFunctionにSetWaitShotと書きます。
アニメーションイベントはAnimatorが設定されているゲームオブジェクトに送られるのでアニメーションの再生がイベントを作成した所に来たら、MyCharaのSetWaitShotメソッドが呼ばれるようになります。
その為、銃を構えるアニメーションのイベント部分にきたらSetWaitShotメソッドを呼び出しwaitShotをtrueにしています。
これで銃を撃つ時の修正が完了しました。
キャラクターの角度を動かしている時の対応
以前の記事でキャラクターの向きを変更している時は歩行アニメーションを再生していました。
しかし止まっている状態で銃の狙いを定める時に歩行アニメーションを再生すると上下に浮き沈みする為、狙いがブレてしまっています。
歩行アニメーションを使わずキャラクターの角度を変更している時専用のアニメーションを使い上下の動きが少ないものにすれば解決します。
ですがわたくしはそんなアニメーションがないので、キャラクターの向きを変更している時は歩行アニメーションの再生をやめその場で回転するだけにします。
多人数参加型のゲームにした場合はその場で回転だけしアニメーションの再生をしていないとおかしい感じになるのでアニメーションは設定した方がいいとは思います。
オンライン対応している場合はローカルの時だけ歩行アニメーションの再生をやめ他のユーザーの自キャラだけ歩行アニメーションをさせるというのもありかもしれませんね・・・。
それが出来るかどうかはわかりませんが・・・・(^_^;)
とりあえずMyCharaスクリプトの回転時に歩行アニメーションを再生していた箇所を修正します。
1 2 3 4 5 6 7 8 9 |
if (runFlag && !charaRotFlag) { animator.SetFloat ("Speed", 2.1f); } else if(!charaRotFlag) { animator.SetFloat ("Speed", 1.0f); //} else { // animator.SetFloat("Speed", 1.0f); } |
いずれ元に戻す可能性もある為コメント化してますが、条件もスッキリさせてもいいかもしれません。
DirectInputとXInputの切り替え
パソコン用コントローラーに対応する事は出来ましたが、種類によって操作が出来なくなってしまう可能性も残ります。
InputManagerの設定でDirectInput用、XInput用の2つの設定を用意し、ゲームのオプション画面でどちらか選択出来るようにしておくのもいいかもしれません。
例えば銃を撃つ時のDirectInputではFire1にし、XInputではFire1_XInputという設定として作成しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
private bool xInput; // XInputならtrue、DirectInputならfalse private string inputShot = "Fire1"; // 銃を撃つInputManagerの設定 void Start () { if (xInput) { inputShot = "Fire1_XInput"; } } void Update () { if(waitShot && Input.GetButtonDown(inputShot) { 銃を撃つ処理 } } |
初期設定をDirectInputにしている時はFire1を銃を撃つ時のボタンにし、XInputならStartメソッド内でFire1_XInputの設定に変更します。
実際にどのボタンが押されたか判定する時の引数にinputShotを渡せば中の文字が設定によって変更されるのでコントローラーの設定で切り替える事が出来ます。
作成した設定がうまく働かない場合は、スタンドアロン形式であればゲームを実行する時に操作ボタンを切り替える事が出来るのでユーザーに自分で設定してもらうというのもいいかもしれません。
終わりに
今回、ゲームパッドに対応した時にキーボードとマウスでの操作を出来なくしてしまいましたが、前述した通りに修正すればキーボードとマウス操作も残せます。
今後の記事ではゲームパッドでの操作だけで話が進んでいくのでもし何らかの操作を変更した時は独自に修正を加えていってください。
コメント
First Person Controllerを使ってゲームを作っているのですが、PS4のコントローラーの右スティックを使ったキャラの視点の上下・回転の移動ができません。
MouseLookスクリプトを書き換えたりしてみたのですが、うまくいかないので教えていただけると嬉しいです。
(左スティックを使ったキャラの移動はできました)
この記事のようにパソコンのコントロールパネルでPS4のコントローラーのジョイスティックやボタンを操作してみて反応しているようであればコントローラーの問題はないと思いますので、UnityのInputManagerの設定を変えれば大丈夫だと思います。
あらかじめ言っておかなければいけないんですが、わたくしPS4を持っていないのでわたくしの場合PS3コントローラーで試しています。
右スティックのでの上下、左右のAxisはドライバによって?変わるようでこの記事の「UnityのInput Managerの設定」の項目と同じようにTypeをJoystick Axisにし、Axis項目でAxisの番号を変更して右スティックの方向を取得してみます。
わたくしの今の環境では
のような感じで右スティックの上下、左右が取得出来ました。
確認には簡単なキャラクター移動スクリプトを作成し、右スティックでキャラクターが移動するようにして確認してみました。
これを視点の変更に適用していけば大丈夫だと思います。
返信ありがとうございます!
書いていただいたスクリプトを使ったら右スティックでの視点変更ができました。ただマウスの時のように、滑らかに動かしてエイムを合わせるところまで持っていきたいのですがどこを変更すれば良いでしょうか?
お手数かけて申し訳ありません…
ここまでの記事ではマウス操作で動かしていたのでInputManagerでMouse X、Mouse Yでキャラクターや視点の回転を行っていました。
ですがジョイスティックでも対応出来るようにした場合、Input.GetAxis(“RightLeft”)やInput.GetAxis(“UpDown”)で行いたいところです。
そこでInputManagerにRightLeftとUpDownをもう一つずつ増やし、そこにMouse XとMouse Yと同じ設定を書き込みます。
そうする事でマウス操作でもジョイスティック操作でも同じようにキャラクターの回転と視点の上下が出来るようになります。
キャラクターの横の回転はRotateCharaメソッド、キャラクターの視点の変更はRotateCameraメソッドで行っているので、そこでMouse XとMouse Yを使っていた所をRightLeftとUpDownに変更するだけです。
InputManagerでジョイスティックのRightLeftとUpDown、マウス操作のRightLeftとUpDownが出来ていればスクリプトの書き換えは2行変えるだけです。
この記事ではマウス操作が出来ないように変更してますが・・・、徐々に回転させているのでジョイスティック操作をしていなくても回転しますがそこら辺はジョイスティックの値が0じゃない時だけ回転させるようにすれば良さそうですね。
処理の細かい部分はここまでのFPSの記事で解説しているのでそちらを参照してください。
あ・・・スタンダードアセットのMouseLookスクリプトを使って操作しているんですね・・・、でもやっている事は同じなので書き換えるだけで出来そうです。
最初に書いていただいたJoyStickTestなのですが
右スティックを右に倒す → 東を向く
右スティックを左に倒す → 西を向く
右スティックを上に倒す → 北を向く
右スティックを下に倒す → 南を向く
上のように固定されてしまいます。
右スティックを上下に動かした時 → 上下を向く(空と地面)
右スティックを右に倒し続ける → カメラが右回転に回り続ける
右スティックを左に倒し続ける → カメラが左回転に回り続ける
というようなスクリプトにして、FPSゲームのような動きにしたいです。
すごく難しそうなのですができるものでしょうか?
上手く説明できなくてすみません。もし理解していただけなければtwitterで動画を送らせていただきたいです。
徐々に回転という処理はMouseLookのQuaternion.SLerpを使った処理の中にすでに含まれており、MouseLookスクリプトのLooKRotationメソッドが回転を計算している処理なのでそこで、Mouse XとMouse Yの部分をRightLeftとUpDownに変更すればそのままゲームパッドに適用出来ます。
マウス操作をゲームパッドの右スティックで行いたいという事であればここの書き換えだけで行えるようになります。