Unityでオフラインの対戦プレイや協力プレイを実現する方法

記事内に広告が含まれています。

今回はUnityでオフラインの対戦プレイや協力プレイを実現する機能を作成したいと思います。

今回の機能を作るにはキーボードやマウス操作ではなくゲームパッドに対応している必要があります。

UnityでPS3コントローラー(ゲームパッド)に対応して動かしてみる
UnityのゲームでPS3コントローラー等のゲームパッドを使用してみます。パソコンのゲーム用コントローラーを持っていない人は便利かもしれません

↑の記事を参考にしてください。

スポンサーリンク

プレイヤーキャラクター1の操作スクリプトPlayer1を作成

キャラクターを操作するスクリプトPlayer1を作成します。
Player1スクリプトはキャラクターの移動、攻撃機能を取りつけてあります。

スクリプトを見てみると

キャラクターの移動はInput.GetAxis(“Horizontal”)とInput.GetAxis(“Vertical”)

攻撃はInput.GetButtonDown(“Fire1”)

で検知しています。

Inputなんちゃらというのは

Unityのメニュー→Edit→Project Settings→Input

でキーやジョイスティックで対応するものを指定しています。

InputManagerの設定

例えばHorizontalに対応するキー等を変更したい時は↑Positive ButtonやNegative Buttonのキーを変更してあげればいいわけです。

デフォルトでHorizontalは

←キー、→キー、ジョイスティックの←、ジョイスティックの→、キーボードのa、キーボードのd

となっています。

例えばtキーをPositive Buttonに設定すればスクリプトでInput.GetAxis(“Horizontal”)と記述した時にtのキーを押しても右側に動くようになります。

ここら辺はさきほど紹介したゲームパッドに対応する記事でも紹介してるので参照してください。

これでプレイヤー1用のPlayer1スクリプトが完成したので次にプレイヤー2用のPlayer2スクリプトを作成します。

Player1スクリプトを選択した状態でWindowsならCtrl+Dキーを押します。

スクリプトがコピーされますので、名前をPlayer2とします(すでになってると思いますが)。

プレイヤー同士は同じ機能を持っていないと不公平なのでコピーしました。

ですが、このままキャラクターにスクリプトをそれぞれ設定してゲームパッドを2つ繋いでもどちらかのゲームパッドの操作で両方のキャラクターが動いてしまいます。

どちらのゲームパッドを動かしているかを判別しないと別々に動かす事が出来ません。

プレイヤーキャラクター2操作スクリプトPlayer2の変更点

Player2スクリプトでは

Input.GetAxis(“Horizontal”)をInput.GetAxis(“Horizontal2”)
Input.GetAxis(“Vertical”)をInput.GetAxis(“Vertical2”)
Input.GetButtonDown(“Fire1”)をInput.GetButtonDown(“Fire1_2”)

と変更します。

Fire1をFire2としないのはFire2はすでに定義されておりマウスの右クリック等が設定されている為に名前の付け方を変えました。

↑の部分の変更だけなのでPlayer2のスクリプトは割愛します。

つまり入力に対する設定を別々にしているんですね。

InputManagerでジョイスティックの番号で処理を分けて設定

再度Unityメニュー→Edit→Project Settings→InputでInputManagerを開きPlayer2で変更した設定を作成していきます。

ジョイスティックの番号を変更

ジョイスティックの操作を設定しているHorizontal(もうひとつHorizontalがあるがそちらはキーでの設定)の設定を選択して右クリック→Duplicate Array Elementをしてコピーします。

コピーされた方はHorizontal2と名前を変更します。
それぞれのJoy Numの項目でJoyStick1とJoyStick2に変更します。

これでそれぞれのジョイスティックで設定が変わります。

攻撃ボタンに対応するジョイスティックを変更する

攻撃ボタンも同じようにFire1をコピーしてFire1_2を作成します。
今までは

joystick button 15

と設定していたので、どのジョイスティックのボタンを押してもInput.GetButtonDown(“Fire1”)が反応していました。
それを

joystick ジョイスティックの番号 button 15

と設定する事で、特定のジョイスティックの15に割り当てられたボタンが対応する事になります。

ジャンプに対応するジョイスティックボタンを変更する

Jump2もJumpをコピーして攻撃ボタンの時と同じように設定します。

これで機能が完成しました。

キャラクターを2人作成し、Player1とPlayer2を設定します。

それではUnityの実行ボタンを押して別々のジョイスティックで操作出来るか確認してみましょう。

オフライン対戦ゲームを実現する為の機能の確認

↑のようにPS3のコントローラーを2つパソコンに繋げて操作する事が出来ました。

InputManagerではジョイスティックの番号で振り分けは出来るみたいなんですが、キーボードを2つ繋いで振り分けは出来ないのかな・・・・謎

キーボードで対戦ゲームを作るには1つのキーボードでキーの割り当てを変えて作るというのでもいいかもしれませんね。

1つのスクリプトを使ってインスペクタでボタン名を変える

ここまでのスクリプトだと2つまったく同じ処理を書いたスクリプトを2つ用意する必要があります。

ですが、そんな面倒な処理をしなくてもインスペクタで押すボタンを切り替える事が出来ます。

例えばインスペクタで押すボタンの文字列を設定するようにします。

↑のようにインスペクタでボタン名を設定出来るようにすれば実際に使う時に

↑のように指定します。

インスペクタでボタン名を変更すれば一つのスクリプトで押すボタンを変える事が出来ます。

インスペクタで押すボタン名を指定する

↑はPlayer1用の設定で、Player2はインスペクタでHorizontal2等に文字列を変えるだけです。

終わりに

この記事の作成の為にPS3コントローラーで使えるUSBケーブルを買いました(^_^;)

コントローラーを繋いでみた所なんだかジャンプボタンが反応しないんですが・・・・、壊れてるのか、はたまたジョイスティックを2つ繋いでオフラインで振り分ける機能自体が
おかしいのか・・・・謎

もし機能自体が間違っていた時はごめんなさい・・・・(^_^;)

InputManagerのJoy Numが公式マニュアルだと

軸を制御する接続されたジョイスティックの数

一般的なゲーム入力 - Unity マニュアル
Unity はキーボード、ジョイスティック、ゲームパッド入力をサポートします。

となっていて、『ジョイスティックの数』となってるんですよね、英語を日本語に訳した時にこうなってしまっただけならいいんですが・・・。

『ジョイスティックの番号』であれば問題なくなります。

とりあえずUnityでオフラインの対戦プレイや協力プレイを実現する機能が出来ました。

InputManagerの設定でJump等にキーボードのspace等が設定されたままになっているので、キーボードのspaceを押せば両方のキャラクターがジャンプしてしまいます。

こういった動作をさせたくない場合はキーやマウス操作の設定は消しておいた方がいいかもしれません。

ジョイスティックの番号が11まであるので最大11までジョイスティックを繋いで遊べるんだろうか?

これはサッカーゲームを想定しての数かも?

サッカーゲーム・・・制御が難しそうですね・・・・(;_; )おろおろ ( ;_;)

タイトルとURLをコピーしました