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

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

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

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

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

スポンサーリンク

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

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

スクリプトを見てみると

キャラクターの移動はInput.GetAxis(“Horizontal”)とInput.GetAxis(“Vertical”)
ジャンプはInput.GetButtonDown(“Jump”)
攻撃は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(“Jump”)をInput.GetButtonDown(“Jump2”)
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つのキーボードでキーの割り当てを変えて作るというのでもいいかもしれませんね。

終わりに

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

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

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

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

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

Unity のマニュアルは、Unityの使い方を学ぶ手助けとなります。Unityを使って 2D や 3D ゲームを作成したり、ゲーム以外のアプリを作成したりして多くの経験を積みましょう。

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

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

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

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

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

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

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

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

この記事作成後に気づいたんですがキャラクター操作スクリプトをPlayerとして作成していたならば、その中でキーやゲームパッドの入力を受け付けている個所を
関数で別に作成しておいて、Playerを継承してPlayer1、Player2を作成して関数部分だけオーバーライド(上書き)した方が楽な気がします。

継承については

UnityのJavaScriptでクラスの作成と継承、インタフェースの作成
UnityのJavaScriptでクラスやインタフェースの作成方法を学び、イベントの受け取りで実際に使用してみます
Unityの継承を使ってキャラクター操作機能を拡張する
Unityの継承を使ってキャラクター操作スクリプト機能を引き継ぎ、子クラスで新しい機能を取りつける事が出来ます。 キャラクターの拡張をしたい時は便利ですね。

を参考にしてください。