UnityでPS3コントローラー(ゲームパッド)に対応して動かしてみる

今まではキャラクターを動かす時にキーボードとマウスを使って動かしていましたが、
パソコン用のゲームパッドやPS3のコントローラーで動かす事が出来れば市販のゲームと変わらずプレイ出来るので、独自のキーボードやマウスの操作方法で動かす必要もなくなります。

今回はPS3のコントローラーでキャラクターを動かす事が出来るようにします。

わたくしはMotionInJoyを入れてやってみたんですが、見事にマウスが反応しなくなり焦りました・・・・。
フリーズしたのかと思ったら設定が変わっていたようです。

マウスが反応しなくなった時に困らないようキーボード操作だけでスタート画面を開いてコントロールパネルのデバイスのマウスの設定を変更出来るようにしておいた方がいいです。

キーボードの画面を開くボタン、方向キー、Tabキー、Enterキーで設定変更まで出来ますので、操作方法だけ覚えておいた方がいいです。

なお、PS3のコントローラーをパソコンで使用出来るようにする方法は

この記事はOculus Rift Advent Calendar 2014の2日目です。 ■1日目の記事その1 野生の男さん「Oculus Rift x LEAP Motion x JOBA x Wiiリモコンでドラゴンに乗ってみた」 ■1日目の記事その2: @hiroyuki_honさん「ニート・無職のためのOcul...

を参考にさせて頂きました。

MotionInJoyを入れる前に見ておけばよかった・・・・

PS3本体はずいぶん前からYLOD?で起動すら出来なくなったので久しぶりにコントローラーを触った感じです・・・(^_^;)
PS3とPS4がほしいです。

ダークソウル3がやりたいなぁ・・・・・(=_=)

わたくしがやるのは今までのキーボード操作とマウス操作で動かしていた部分をPS3コントローラーで動かす処理に変更するところです。

スポンサーリンク

Better DS3のコントローラーの設定をする

まずはコントローラーの設定から作ります。

Better DS3起動後の画面

Better DS3を起動したら↑のような画面が開くので、赤い枠のNewをクリックし、
Direct Inputを選択します。

XInputを選択した時の画面

XInputを選択すると↑のような画面になり、赤枠のXBox 360ボタンを押すとXBox 360の設定に自動で変換されます。

今回はDirect Inputで話を進めるので、↑の画面のようにXBox 360ボタンは表示されません。

コントローラー1

Unityという名前で作成します(名前は自由に付けてください)。

コントローラー2

上記のように設定しました。

MotioninJoyを入れた時の設定と同じ?です。

PS3のR2とL2はあまり使わないのでXInputを選びXBOX360コントローラーと同じボタン設定にする事も出来ます。
自動でボタン設定が出来るので楽です。

そうするとゲームパッドのボタン番号が変わるのでUnityで設定する時は注意が必要です。

Unityで設定する時にここで指定した番号を使う事になります。
設定が終わったら下の方にあるSave Profileを押してデータを保存します。

設定を変更したい場合は最初の画面でSelected Profileでさきほど作成したUnityのデータを選択しEditボタンを押せば
再設定をする事が出来ます。

Better DS3で設定したボタンが反映されているかの確認

さきほど設定したPS3コントローラーとボタンの設定がちゃんと反映しているか確認します。

Better DS3のControllerPanelを押す

↑のようにControll Panelをクリックします。

接続されているコントローラーを選択しプロパティを押す

↑のように接続されているコントローラーを選択する画面が出るので確認したいコントローラーを選択し、プロパティをクリックします。

PS3コントローラーを操作し押したボタン等が反応するのを確認する

↑のようにPS3のコントローラーを押すとアナログスティックの操作やボタンを押す事でどの番号が反応するかを確認する事が出来ます。

このプロパティはWindows7であれば

スタートメニュー→コントロールパネル→ハードウェアとサウンドのところのデバイスとプリンターの表示→PLAYSTAION(R)3 Controllerを右クリック→ゲームコントローラーの設定

からも見る事が出来ます。
他のWindowsやMacはわかりません。

UnityのInputManagerでキーとボタンの設定をする

次にUnityで設定をしていきます。

Unityのメニュー→Edit→Project Settings→Inputを選択するとインスペクタにInputManagerが表示されます。

コントローラー3

Axesのすぐ下のSizeの値を増やすと設定値が増やせます。

スクリプトでInput.GetAxis(“Horizontal”)やInput.GetAxis(“Jump”)としてキーの受付をしていましたが、ここで設定したHorizontalやJumpに指定されているキーが押された時に値の取得や実行をしていました。

つまりHorizontalでは→←のキーを押した時に値を取得していますが、設定を変えるとAのキーを押したらHorizontalの値を取得するという設定にも変更出来てしまいます。

コントローラー4

Nameの所はスクリプトから参照する時に使用する名前です。

Negative Buttonが負の値を設定する所で、Horizontalの場合←キーを押したら負の値になります。

Positive Buttonが正の値を設定する所で、→キーを押したら正の値になります。
Invertにチェックを入れると値が反転されます。

カメラを移動させる時に移動方法を反転させたい時に使えそうですね。

Typeはキーボード操作とマウス操作で設定するタイプやジョイスティックの動きで設定するタイプ等があります。

上の画像ではキーを設定しているのでTypeはKey or Mouse Buttonに設定します。

InputManagerでHorizontalは最初から2つ設定されているけどなんで!?

と思われる方もいるかもしれませんが、これはHorizontalはキーボードでの操作とジョイスティックでの2つの操作を考慮しているからです。
さきほどのHorizontalはキーボードでの設定です。

コントローラー5

下の方にあるもうひとつのHorizontalは上の画像のようになり、TypeがJoystickAxisになっています。

設定の仕方はこれでわかったので、PS3コントローラーでキャラクターの移動やジャンプ、攻撃等の設定を作っていきましょう。

と言っても、移動で使うHorizontalとVerticalは元々あるものを使いますので、ジャンプと攻撃の設定を行います。

ジャンプはキー操作でspaceキーを押すと反応するように設定されています。

Jumpを選択しAlt Positive Buttonにjoystick button 14を指定してください。
そうするとPS3のコントローラーの×ボタンを押すとジャンプするようになります。

joystick button 番号

の番号部分をBetter DS3で指定したボタン番号-1にします。Unityは0番目から始まるので1を引きます。

Alt Positive Buttonのに設定するのではなく新しくJumpと同じ名前で設定
を作りPositive Buttonに指定する事も出来ます。

設定を増やすには前述したSizeの値を増やせば出来ます。増やした場合は最後の設定項目と同じ物が下に作られます。

キャラクターをジャンプさせるには、もちろんジャンプ機能を搭載していなければなりません。

Unityでキャラクターがジャンプ出来るようにする
Unityのゲームでキャラクターがジャンプ出来るようにする機能を作成します。

を参考に機能を作成してみてください。

コントローラー6

Jumpの設定は上のようになりました。

次は攻撃時の設定です。
攻撃する時は

Input.GetButtonDown(“Fire1”)

を使ってマウスの左クリックを押した時に攻撃していました。

攻撃機能に関しては

Unityで主人公キャラが敵を攻撃出来るようにする機能
Unityで主人公キャラが剣を振って敵キャラを攻撃出来るようにする機能を作成します

連続攻撃機能を作るには

Unityのアクションゲームで連続攻撃を実現する方法
Unityのアクションゲームで連続攻撃が出来る機能を作成します。現在攻撃中の時に攻撃ボタンを押したら次の攻撃アニメーションが再生されるようにします

を参照してください。

攻撃時に使用しているFire1の項目を見ると、すでにLeft CtrlがPositive Buttonにmouse 0がAlt Positive Buttonに設定されてしまっているので、新しい項目を作りNameをFire1としてそこのPositive Buttonに□ボタンを押した時に反応するよう設定します。

コントローラー7

□ボタンはBetter DS3で16番に設定したのでUnityでは

joystick button 15

と設定します。

これでジャンプと攻撃の設定が終了しました。

Unityを実行してPS3コントローラーで操作出来るか確認してみる

それではUnityの実行ボタンを押して、PS3のコントローラーでキャラクターが動作するか確認してみましょう。

コントローラー8

上が実行結果です。

これだけだとPS3のコントローラーで動かしているかどうか全然わかりませんね・・・・。
嘘偽りなくちゃんと動かしてますよー(^O^)

スクリプトにキーやボタンを取得してジャンプや攻撃をする処理を記述する時に注意が必要です。
たとえばFのキーを押した時やマウスの左を押した時に攻撃をしたい場合

Input.GetKeyDown(“f”)
Input.GetMouseButtonDown(0)

と記述しているとゲームパッドを使用した時に反応しません。
キーボードとマウス、ゲームパッドすべてで操作可能なゲームを作る場合は

Input.GetButtonDown(“Fire1”)

と記述しInputManagerでFire1の設定値にfキー、mouse 0、joystick button 15(設定によって変わる)を指定します。

スクリプトでキーを指定するのではなくInputManagerで設定するようにすれば他のキーで攻撃をするようにしたい場合等にスクリプトの修正ではなくInputManagerの設定を変更するだけで対応出来るようになるので便利です。

ゲームユーザーがコントローラーの設定をする方法

今回Unity側でFire1はこのキーやこのボタン、と設定しましたが、使用するゲームパッドによっては設定が違う可能性もあります。

そんな時はゲーム起動時に入力の設定を変更出来るのでユーザーに変更してもらう事も出来ます。

スタンドアロン(パソコンにダウンロードしてやるゲーム)形式では入力の設定が出来ますが、他の形式ではどうなんでしょ?
とりあえず今の所は配布形式だけ考えていきましょう。

コントローラー9

ゲームのアイコンをクリックしゲームを起動したら、上のようにInputタブを選択し、PrimaryやSecondryをクリックし、変更したいキーを押して変更する事が出来ます。

例えばHorizontalの→キーを押して移動しているのをqキーに変更したい場合はHorizontal(+)のPrimaryのrightの部分をクリックしその後qキーを押します。

これで変更が可能です。

ユーザーに設定項目がわかりやすいように名前を変更する

ただゲームをプレイするユーザーがHorizontal(+)ってなに?となる事がほとんどなので、もっとわかりやすい名前を設定しましょう。

コントローラー10

InputManagerインスペクタで上のようにHorizontalのDescriptive NameとDescriptive Negative Nameにわかりやすい名前を指定します。

Descriptive NameはPositive Buttonを押した時の名前
Descriptive Negative NameはNegative Buttonを押した時の名前

になります。
Fire1も分かりづらいのでAttackに変更します。

コントローラー11

上が結果です。
Horizontal(+)やHorizontal(-)ではなくLeftとRightにしたことでわかりやすくなりました。
名前はわかりやすくなりましたが、操作方法を変更するやり方は分かりづらいのでそれを解説する必要はありそうですね。

今回の場合PS3コントローラーをゲームパッドとして使用する時の設定をしましたが、
パソコン用のコントローラーを繋いだ時のデフォルトのキー設定ってどうなっているんでしょう?

パソコン用のコントローラーで試して確認してみる必要があるけど、ないので各自確認をお願いします・・・(^_^;)