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

確認済のバージョン: 5.3

-

難易度: 中級

前項までは、主にプレイヤーゲームオブジェクトに焦点を当ててサンプルプロジェクトを進めてきました。しかし、ほとんどのゲームでは、ゲーム世界の中に多数の非プレイヤー ゲームオブジェクトが存在します。今回このサンプルプロジェクトでは、環境に含まれるゲームオブジェクトは無視し、敵などの非プレイヤー ゲームオブジェクトに焦点を当て進めていきます。

プレイヤーゲームオブジェクトはクライアントがホストに接続された時に生成されますが、敵ゲームオブジェクトはサーバーによって制御される必要があります。

この項では、非プレイヤーの、敵(enemy)ゲームオブジェクトを生成する Enemy Spawner を追加していきます。全てのプレイヤーはこの敵ゲームオブジェクトを撃って倒すことができます。

  • 新しい空のゲームオブジェクトを 1 つ作成してください。
  • 作成した新規ゲームオブジェクトの名前を “Enemy Spawner” に変更してください。
  • Enemy Spawner ゲームオブジェクトを選択した状態で、
  • ... Network > NetworkIdentity コンポーネントを追加してください。
  • ... NetworkIdentity コンポーネントの、Server Only のチェックボックスを オン にしてください。

Server Onlyオン に設定すると、Enemy Spawner がクライアントに送られなくなります。

  • Enemy Spawner ゲームオブジェクトが選択された状態で、
  • ... “EnemySpawner” という名前のスクリプトを作成・追加してください。
  • 編集用に “EnemySpawner” スクリプトを開いてください。
  • スクリプト内のコードを全て、以下の簡単な “EnemySpawner” クラスに置き換えてください。

EnemySpawner

Code snippet

using UnityEngine;
using UnityEngine.Networking;

public class EnemySpawner : NetworkBehaviour {

    public GameObject enemyPrefab;
    public int numberOfEnemies;

    public override void OnStartServer()
    {
        for (int i=0; i < numberOfEnemies; i++)
        {
            var spawnPosition = new Vector3(
                Random.Range(-8.0f, 8.0f),
                0.0f,
                Random.Range(-8.0f, 8.0f));

            var spawnRotation = Quaternion.Euler( 
                0.0f, 
                Random.Range(0,180), 
                0.0f);

            var enemy = (GameObject)Instantiate(enemyPrefab, spawnPosition, spawnRotation);
            NetworkServer.Spawn(enemy);
        }
    }
}

このスクリプト内でいくつか重要な点を以下に挙げます。

  1. 名前空間 UnityEngine.Networking が必要です。
  2. このクラスは NetworkBehaviour から派生する必要があります。
  3. このクラスは仮想関数 OnStartServer を使用しています。
  4. サーバーが開始されると、多数の敵がランダムな位置および角度で生成され、その後 NetworkServer.Spawn(enemy) によってspawn(オブジェクト生成) されます。

OnStartServer は、先にこのチュートリアル中でプレイヤーゲームオブジェクトの色を変えるために使用した OnStartLocalPlayer と非常によく似ています。ここでは、サーバーがネットワークのリッスンを開始すると OnStartServer がサーバー上で呼び出されます。NetworkBehaviour ベースクラスから利用できる仮想関数に関する詳細は、Unity マニュアルの NetworkBehaviour に関するページオブジェクトの Spawn(生成)に関するページ、またはスクリプトリファレンスの NetworkBehaviour に関するページ をご覧ください。

  • スクリプトを保存します。
  • Unity に戻ってください。

これで Enemy Spawner が作成されました。次に敵 (enemy) ゲームオブジェクトを生成(spawn)させる必要があります。

これを簡単に行うために、プレイヤープレハブを敵のベースとして使用しましょう。敵は、既に Player プレハブに添付されている NetworkIdentity コンポーネントと NetworkTransform コンポーネントを必要とします。また Health スクリプトおよび Healthbar のセットアップも必要です。

敵とプレイヤープレハブとの見分けが付くように、敵ゲームオブジェクトを少しカスタマイズしましょう。

  • Player プレハブを Hierarchy にドラッグし、シーン内に Player ゲームオブジェクトのインスタンスを 1 つ作成してください。
  • Player ゲームオブジェクトの名前を “Enemy” に変更してください。
  • この Enemy ゲームオブジェクトを Project ウィンドウにドラッグして戻すと、新しい Enemy プレハブが作成されます。

この時点で Enemy プレハブを作成するのは、加えた変更が、関連付けられた Player プレハブに反映されてしまう可能性を排除するためです。シーン内の Player プレハブのインスタンスから新しいプレハブを作成することで、そのシーン内のプレハブのインスタンスが、Project ウィンドウ内の新しいプレハブアセットに関連付けられます。

  • Hierarchy ウィンドウで Enemy ゲームオブジェクトが選択された状態で、
  • ... Gun という名前の子ゲームオブジェクトを削除してください。

Unity が、該当の Prefab インスタンスを破棄する旨の警告を出します。

  • Continue をクリックしてください。
  • ゲームオブジェクト Enemy が選択された状態で、
  • ... Bullet Spawn という名前の子ゲームオブジェクトを削除してください。
  • ... ルートのゲームオブジェクトから PlayerController スクリプトを削除してください。

この時点で敵は実際に機能する状態になっていますが、見た目がプレイヤーゲームオブジェクトと全く同じです。プレイヤーとの違いを出すために、いくつかディテールを加えていきましょう。

まず、単純に、カラースキームを反転させます。

  • Black マテリアルを Enemy ゲームオブジェクトに適用してください。
  • Visor ゲームオブジェクトの MaterialDefault-Material に設定してください。

次に、お好みで、ヘッドピースも作成してみましょう。

  • ゲームオブジェクト Enemy が選択された状態で、
  • ... 新規の Cube を 1 つ、子ゲームオブジェクトとして作成してください。
  • 作成した新しい子ゲームオブジェクトの名前を "Mohawk” に変更します。
  • Mohawk の Transform Position(0.0. 0.55, -0.15) に設定してください。
  • Mohawk の Transform Scale(0.2, 1.0, 1.0) に設定してください。
  • Mohawk の BoxCollider コンポーネントを削除してください。

Enemy は、このような感じで表示されるはずです。

description

  • ... Enemy プレハブに変更を適用してください。
  • Enemy ゲームオブジェクトをシーンから削除してください。
  • シーンを保存してください。

これで Enemy プレハブがセットアップされたので、最後に Enemy プレハブを登録し、Enemy Spawner に追加しましょう。

  • Hierarchy ウィンドウで NetworkManager を選択してください。
  • NetworkManager が選択された状態で、
  • ... Spawn Info のドロップダウンメニューを開いてください。
  • ... Registered Spawnable Prefabs のリストに、「 + 」 ボタンで新しい行を追加してください。
  • ... Registered Spawnable Prefabs リストの新しい行に Enemy プレハブを追加してください。
  • Hierarchy ウィンドウで Enemy Spawner を選択してください。
  • Enemy Spawner が選択された状態で、
  • ... Project ウィンドウから、Enemy Prefab フィールドに Enemy プレハブアセットを設定してください。
  • ... Number Of Enemies4 に設定してください。

description

  • プロジェクトを保存してください。

Enemy プレハブは Player 同様 Health スクリプトを持っているので、Bullet スクリプトは Player だけでなく敵 (Enemy) の Health スクリプトも検知します。したがって、ここでは一切修正を加える必要はありません。

  • このシーンを、スタンドアロンのアプリケーションとして Build and Run(ビルドおよび実行)します。
  • ゲーム内 UI から Host ボタンをクリックすると、このゲームがホストとして開始されます。

この時点で、第一プレイヤーと 4 体の敵が作成されているはずです。

  • Player ゲームオブジェクトを動かしてください。
  • Unity に戻ってください。
  • Play モードを開始します。
  • ゲーム内 UI から LAN Client ボタンをクリックすると、クライアントとしてホストに接続されます。

第二プレイヤーが作成され、第一プレイヤーおよび全ての敵がこのインスタンスに追加されたはずです。

敵を撃つと、撃たれた敵の体力は減少しますが、敵は RpcRespawnisLocalPlayer チェックの条件を満たさないため、体力がゼロになっても再生成されません。ただし敵の「現在の体力」は、サーバーによって制御されているため最高値に戻ります。

  • スタンドアロン プレイヤーを終了してください。
  • Unity に戻ってください。
  • Play モードを終了してください。