今回はUnityでオフラインの対戦プレイや協力プレイを実現する機能を作成したいと思います。
今回の機能を作るにはキーボードやマウス操作ではなくゲームパッドに対応している必要があります。
↑の記事を参考にしてください。
プレイヤーキャラクター1の操作スクリプトPlayer1を作成
キャラクターを操作するスクリプトPlayer1を作成します。
Player1スクリプトはキャラクターの移動、攻撃機能を取りつけてあります。
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | using UnityEngine; using System.Collections; public class Player1 : MonoBehaviour { private Animator animator; private CharacterController cCon; private Vector3 velocity; void Start () { animator = GetComponent<Animator>(); cCon = GetComponent<CharacterController>(); velocity = Vector3.zero; } void Update () { // キャラクターコライダが接地、またはレイが地面に到達している場合 if(cCon.isGrounded) { velocity = Vector3.zero; var input = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical")); // 方向キーが多少押されている if(input.magnitude > 0f) { animator.SetFloat("Speed", input.magnitude); transform.LookAt(transform.position + input); velocity += input.normalized * 2f; // キーの押しが小さすぎる場合は移動しない } else { animator.SetFloat("Speed", 0); } if(Input.GetButtonDown("Fire1")) { animator.SetBool("Attack", true); } } velocity.y += Physics.gravity.y * Time.deltaTime; cCon.Move(velocity * Time.deltaTime); } } |
スクリプトを見てみると
キャラクターの移動はInput.GetAxis(“Horizontal”)とInput.GetAxis(“Vertical”)
攻撃はInput.GetButtonDown(“Fire1”)
で検知しています。
Inputなんちゃらというのは
Unityのメニュー→Edit→Project Settings→Input
でキーやジョイスティックで対応するものを指定しています。
例えば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つ用意する必要があります。
ですが、そんな面倒な処理をしなくてもインスペクタで押すボタンを切り替える事が出来ます。
例えばインスペクタで押すボタンの文字列を設定するようにします。
1 2 3 4 5 6 7 8 | [SerializeField] private string horizontalString; [SerializeField] private string verticalString; [SerializeField] private string fire1String; |
↑のようにインスペクタでボタン名を設定出来るようにすれば実際に使う時に
1 2 3 4 5 6 7 | var input = new Vector3(Input.GetAxis(horizontalString), 0f, Input.GetAxis(verticalString)); if(Input.GetButtonDown(fire1String)) { animator.SetBool("Attack", true); } |
↑のように指定します。
インスペクタでボタン名を変更すれば一つのスクリプトで押すボタンを変える事が出来ます。
↑はPlayer1用の設定で、Player2はインスペクタでHorizontal2等に文字列を変えるだけです。
終わりに
この記事の作成の為にPS3コントローラーで使えるUSBケーブルを買いました(^_^;)
コントローラーを繋いでみた所なんだかジャンプボタンが反応しないんですが・・・・、壊れてるのか、はたまたジョイスティックを2つ繋いでオフラインで振り分ける機能自体が
おかしいのか・・・・謎
もし機能自体が間違っていた時はごめんなさい・・・・(^_^;)
InputManagerのJoy Numが公式マニュアルだと
軸を制御する接続されたジョイスティックの数
となっていて、『ジョイスティックの数』となってるんですよね、英語を日本語に訳した時にこうなってしまっただけならいいんですが・・・。
『ジョイスティックの番号』であれば問題なくなります。
とりあえずUnityでオフラインの対戦プレイや協力プレイを実現する機能が出来ました。
InputManagerの設定でJump等にキーボードのspace等が設定されたままになっているので、キーボードのspaceを押せば両方のキャラクターがジャンプしてしまいます。
こういった動作をさせたくない場合はキーやマウス操作の設定は消しておいた方がいいかもしれません。
ジョイスティックの番号が11まであるので最大11までジョイスティックを繋いで遊べるんだろうか?
これはサッカーゲームを想定しての数かも?
サッカーゲーム・・・制御が難しそうですね・・・・(;_; )おろおろ ( ;_;)