Categories: Unity

Unity:非プレイヤーオブジェクトをハンドルする~マルチプレイヤーネットワーキングのチュートリアルに挑戦

Unityの公式チュートリアル「マルチプレイヤーネットワーキング」の実習の模様をお送りしております。前回の記事はこちらからどうぞ

非プレイヤーオブジェクトをハンドルする

公式サイトのチュートリアルページ 非プレイヤーオブジェクトをハンドルする

今回は敵キャラクターの作成を行います。

オブジェクトEnemy Spawner の作成

  1. 新しい空のオブジェクトを作成して名前を “Enemy Spawner” に変更
  2. オブジェクトEnemy Spawner を選択
  3. Network > NetworkIdentity コンポーネントを追加
  4. NetworkIdentity コンポーネントの、Server Only のチェックボックスを オン にする
  5. オブジェクト Enemy Spawner を選択
  6. 新規スクリプト EnemySpawner を追加

完成したオブジェクトEnemy Spawner の[Inspector]を見るとこのようになっています。

スクリプト EnemySpawner の修正

  1. スクリプト EnemySpawner を開く
  2. スクリプト内のコードを全て、 “EnemySpawner” クラスに置き換える
  3. スクリプトを保存

修正したスクリプトのコードにコメントを加えたものがこちら。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// ネットワークコンポーネント関数を使用するため名前空間の追加
using UnityEngine.Networking;

// NetworkBehaviour から派生するクラス
public class EnemySpawner : NetworkBehaviour
{
    // 敵オブジェクトを格納する変数
    public GameObject enemyPrefab;
    // 敵オブジェクトの数を格納する変数
    public int numberOfEnemies;

    // サーバー開始時の処理(仮想関数)
    public override void OnStartServer()
    {
        // 敵オブジェクトの発生処理
        // 敵オブジェクト数が numberOfEnemies より少なければ繰り返す
        for (int i = 0; i < numberOfEnemies; i++)
        {
            // 敵オブジェクトの発生位置
            var spawnPosition = new Vector3(
                // X座標:-8~8までのランダム値
                Random.Range(-8.0f, 8.0f),
                // Y座標:0
                0.0f,
                // Z座標:-8~8までのランダム値
                Random.Range(-8.0f, 8.0f));

            // 敵オブジェクトの発生角度
            var spawnRotation = Quaternion.Euler(
                // X角度:0
                0.0f,
                // Y角度:0~180までのランダム値
                Random.Range(0, 180),
                // Z角度:0
                0.0f);

            // 敵オブジェクトのインスタンス作成
            var enemy = (GameObject)Instantiate(
                // 引数 1:インスタンスオブジェクト
                enemyPrefab,
                // 引数 2:発生位置
                spawnPosition,
                // 引数 3:発生角度
                spawnRotation);
            // すべてのクライアントにオブジェクト enemy を生成
            NetworkServer.Spawn(enemy);
        }
    }
}

完成したスクリプト EnemySpawner を[Inspector]ウィンドウで見るとこのようになっています。

Enemy オブジェクトの作成

  1. プレハブ Player を Hierarchy にドラッグし、シーン内にインスタンスを作成
  2. オブジェクト Player の名前を “Enemy” に変更
  3. オブジェクト Enemy ゲームを Project ウィンドウにドラッグして戻し、新しいプレハブ Enemy を作成
[Project]ウィンドウで確認。プレハブ Player を複製して敵のプレハブができました。

オブジェクト Enemy の子オブジェクト削除とマテリアルを変更

  1. [Hierarchy]ウィンドウでオブジェクト Enemy を選択
  2. 子オブジェクト Gun を削除
  3. プレハブのリンクが解除されるダイアログが表示されたら[Continue]をクリック
  4. 子オブジェクト Bullet Spawn を削除
  5. オブジェクト Enemy から PlayerController スクリプトを削除
  6. オブジェクト Enemy に Black マテリアルを適用
  7. 子オブジェクト Visor の Material を Default-Material に設定
[Hierarchy]ウィンドウでオブジェクト Enemy の子オブジェクトを削除する際に表示されるダイアログはこちらです。[Continue]をクリックします。

オブジェクト Enemy の子オブジェクト Visor に Default-Material を割り当てるには、[Project]ウィンドウのプレハブPlayer を選択し、[Inspector]ウィンドウの Default-Material を[Scene]ビューのオブジェクト Visor に直接ドラッグ&ドロップするとOKです。

オブジェクト Enemy の子オブジェクト追加

  1. オブジェクト Enemy を選択
  2. 基本オブジェクト Cube を 作成して名前を Mohawk に変更
  3. オブジェクト Mohawk を Enemy の子にする
  4. Mohawk の Transform Position を X 0.0, Y 0.55, Z -0.15 設定
  5. Mohawk の Transform Scale を X 0.2, Y 1.0, Z 1.0 に設定
  6. Mohawk の BoxCollider コンポーネントを削除
  7. [Inspector]ウィンドウ > [Apply] をクリックしてプレハブを更新
  8. オブジェクト Enemy をシーンから削除してシーンを保存

完成した敵オブジェクトを[Scene]ビューで見るとこのようになっています。

[Project]ウィンドウでプレハブ Enemy はこのようになっています。

NetworkManagerにEnemy を登録

  1. [Hierarchy]ウィンドウで NetworkManager を選択
  2. Spawn Info のドロップダウンメニューを開く
  3. Registered Spawnable Prefabs のリストの[+]ボタンをクリックして新しい行を追加
  4. Registered Spawnable Prefabs リストの新しい行にプレハブ Enemy を追加
  5. [Hierarchy]ウィンドウで Enemy Spawner を選択
  6. [Project]ウィンドウから、Enemy Prefab フィールドにプレハブ Enemy を設定
  7. コンポーネント Enemy Spawner > Number Of Enemies を 4 に設定
  8. プロジェクトを保存

NetworkManager の[Inspector]ウィンドウで NetworkManager コンポーネントはこのようになっています。

Enemy Spawner の[Inspector]ウィンドウで見るとこのようになっています。

動作確認

  1. シーンをスタンドアロンのアプリケーションとして Build and Run を実行
  2. ゲーム内 UI から[Host]ボタンをクリックしてゲームをホストとして開始
  3. プレイヤーゲームオブジェクトを動かす
  4. Unity に戻ってPlay モードを開始
  5. ゲーム内 UI から[LAN Client]ボタンをクリックしてクライアントとしてホストに接続
  6. プレイヤーゲームオブジェクトを動かして動作テスト
  7. スタンドアロン・プレイヤーを終了
  8. Unity に戻ってPlay モードを終了

このステップを終えてゲームを実行。ビルドしたゲームを2つ実行してウィンドウを並べました。画面右側がホスト(サーバー&クライアント)で画面左がクライアントです。同じ位置に敵キャラクターが4体表示されています。

チュートリアルの解説にある通り、敵に弾を当てると体力ゲージは減少し、体力がゼロになると体力ゲージがリセットされ、敵キャラクターはそのままです。

corevale