Unityの公式チュートリアル「マルチプレイヤーネットワーキング」の実習の模様をお送りしております。前回の記事はこちらからどうぞ
公式サイトのチュートリアルページ マルチプレイヤーシューティングを追加する
プレハブ Bullet の[Inspector]ウィンドウでコンポーネントを確認するとはこのようになっています。(表示は折りたたんだ状態)
弾を発射する処理をクライアントから呼び出してサーバーで実行するようにネットワークコマンドに変更します。
スクリプトコードにコメントを付けて内容を確認しました。黄色マーカー部分が今回の変更箇所です。
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))
{
CmdFire();
}
}
// 弾を発射する処理
//(ネットワークコマンド:クライアントから呼び出しサーバーで実行)
[Command]
void CmdFire()
{
// プレハブ 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;
// クライアント上に弾を生成する
NetworkServer.Spawn(bullet);
// 2秒後に弾を破壊する
Destroy(bullet, 2.0f);
}
// ローカルプレイヤー時のゲームのスタート処理
public override void OnStartLocalPlayer()
{
// MeshRenderer コンポーネントを取得してマテリアルカラーを blue に設定
GetComponent<MeshRenderer>().material.color = Color.blue;
}
}
このステップを終えてゲームを実行。ビルドしたゲームを2つ実行してウィンドウを並べました。ホストになる自分のゲーム画面(下図では左側)で発射した弾が、右側のクライアント画面でも表示されるようになりました。
チュートリアルに書いてある通り、弾のゲームオブジェクトは相手プレイヤーに当たると跳ね返るだけで、相手プレイヤーに対して影響は与えていませんね。