Unityの公式チュートリアルに掲載されているマルチプレイヤーネットワーキングを勉強を進めている様子をお送りします。前回の記事はこちらからどうぞ
公式サイトのチュートリアルページ シューティング(シングルプレイヤー)
今回ステップは非ネットワークの状態でプレイヤーにシューティング機能を追加します。
プレハブ Bullet の[Inspector]ウィンドウはこのようになりました。
次は弾を発射するためにスクリプト PlayerController を修正します。
出来上がったスクリプトコードにコメントを付けて内容を確認しました。
using System.Collections; using System.Collections.Generic; using UnityEngine; // ネットワークコンポーネント関数を使用するため名前空間の追加 using UnityEngine.Networking; public class PlayerController : NetworkBehaviour { // 弾のプレハブを格納する変数 public GameObject bulletPrefab; //弾のプレハブを発生するオブジェクトの Transform を格納する変数 public Transform bulletSpawn; // ゲーム実行中の繰り返し処理 void Update() { // プレイヤーが自分自身でない場合 if (!isLocalPlayer) { // 以降の処理を中断 return; } // 左右方向の入力値を変数 x に代入 var x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f; // 前後方向 入力値を変数 z に代入 var z = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f; // オブジェクトの方向転換の制御 // (変数 xの値をオブジェクトのY軸回転に代入) transform.Rotate(0, x, 0); // オブジェクトの前進、後退の制御 // (変数 z の値をオブジェクトのZ座標に代入) transform.Translate(0, 0, z); // Space キーの入力があったら関数 Fire() を実行する if (Input.GetKeyDown(KeyCode.Space)) { Fire(); } } // 弾を発射する処理 void Fire() { // プレハブ Bullet から インスタンス Bullet を生成する // 変数 bullet にインスタンスを格納 var bullet = (GameObject)Instantiate( // 変数 bulletPrefab に格納されたオブジェクトを bulletPrefab, // 変数 bulletSpawn に格納された Transform の座標で bulletSpawn.position, // 変数 bulletSpawn に格納された Transform の角度で bulletSpawn.rotation); // 弾の速度を増加させる //(Rigidbody コンポーネントを取得して速度6倍で前方に移動する) bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 6; // 2秒後に弾を破壊する Destroy(bullet, 2.0f); } // ローカルプレイヤー時のゲームのスタート処理 public override void OnStartLocalPlayer() { // MeshRenderer コンポーネントを取得してマテリアルカラーを blue に設定 GetComponent<MeshRenderer>().material.color = Color.blue; } }
プレハブ Player の[Inspector]ウィンドウでスクリプトコンポーネントを見るとこのように変数フィールドが追加されました。
プレイヤーオブジェクトに弾を発射するための銃を作成します。
Gun の[Inspector]ウィンドウでTransform のパラメーターはこのようになっています。
プレイヤーオブジェクトに弾発射用オブジェクトを追加する
修正したスクリプト PlayerController で作成した変数フィールがコンポーネントに表示されているので必要なオブジェクトを割り当てます。
Bullet Spawn を ドラッグ&ドロップでフィールドに割り当てるには、[Project]ウィンドウのプレハブ Playerの階層を開いて選択すればOKです。
プレハブ Player の[Inspector]ウィンドウでスクリプトコンポーネントを見るとこのようになりました。
ここまでの手順を動作確認するステップです。
このステップを終えてゲームを実行。今回はビルドしたゲームを2つ実行してウィンドウを並べました。解説に書いてある通り、ローカル(ホスト)となる自分のゲーム画面(下図では左側)では発射した弾が表示されますが、右側のリモート(クライアント)画面では表示されません。
次のステップでリモート側でも自分の発射した弾が表示されるようにネットワークに対応させる手順になりますが、今回はここまでにしたいと思います。