読者です 読者をやめる 読者になる 読者になる

tanaka's Programming Memo

プログラミングについてのメモ。

Unityのネットワーク-プレイヤーの作成と登場-

前へ | 次へ

プレイヤーを作成して、複数のプレイヤーが画面に登場するようにしてみましょう。

プレイヤーを作成する

  • Unityに切り替えます。
  • [Hierarchy]ビューから[Create]>[3D Object]>[Sphere]を選択して球を生成します。
  • 作成した[Sphere]の名前を「Player」に変更します。
  • 当たり判定のためにリジッドボディを組み込みます。
    • [Hierarchy]ビューから[Player]を選択します。
    • [Inspector]ビューの[Add Component]を押して、[Physics]>[Rigidbody]を選択します。
    • [Use Gravity]のチェックを外します。
  • 操作用のスクリプトを作ります。
    • [Project]ビューから[Create]>[C# Script]を選択します。
    • 作成したスクリプトの名前を「CPlayer」などに変更します。
    • [CPlayer]スクリプトをドラッグして、[Hierarchy]ビューの[Player]オブジェクトにドロップします。
    • [CPlayer]スクリプトをダブルクリックしてエディターで開きます。
    • 以下のようにコードを追加します。
using UnityEngine;
using System.Collections;

public class CPlayer : MonoBehaviour {
    private Rigidbody myRigidbody;
    public float fSpeed = 10f;

    // Use this for initialization
    void Start () {
        myRigidbody = GetComponent<Rigidbody>();
    }
	
    // Update is called once per frame
    void Update () {
        Vector3 move = new Vector3(
            Input.GetAxisRaw("Horizontal"),
            Input.GetAxisRaw("Vertical"));
        myRigidbody.velocity = fSpeed * move.normalized;
    }
}
  • 上書き保存をしたら、Unityに切り替えて実行してください。カーソルキーで球が操作できます。

まだネットワークに対応させていないので、サーバーとクライアントで動かしてもキーに反応して移動するだけです。ネットワーク上で出現するようにしましょう。

キャラクターをネットワークに登場させる

マルチプレイヤーゲームでは、新しいプレイヤーが参加したら、全てのプレイヤーの画面に新しいプレイヤーを登場させなくてはなりません。これをやるには通常のInstantiate()ではなく、ネットワークに対応したNetwork.Instantiate()を利用します。

それではネットワーク上にプレイヤーを登場させてみましょう。

  • プレイヤーをスクリプトで生成できるようにプレハブ化します。
    • [Hierarchy]ビューの[Player]オブジェクトをドラッグして、[Project]ビューにドロップしてプレハブ化します。
    • プレハブができたら、[Hierarchy]ビューに残っている[Player]オブジェクトは不要なので削除します。
  • [NetConnector]スクリプトにネットワーク上にプレイヤーを生成するスクリプトを追加します。
    • [Project]ビューの[NetConnector]スクリプトをダブルクリックしてエディターで開きます。
    • 変数isConnectedの定義の下に、以下を追加します。
    // プレイヤーのプレハブ
    public GameObject prefPlayer = null;
    • procConnect関数にネットワーク上にキャラクターを生成するコードを追加します。Network.Connect()を呼び出した直後だと、まだサーバーに接続ができていないことがあり、キャラクターの生成が失敗することがあります。接続が完了すると、ゲームサーバーであればNetwork.isServerが、クライアントであればNetwork.isClientがtrueになるので、コルーチンでこれらのいずれかがtrueになるまで待機してからキャラクターを登場させることにします。
    private void procConnect()
    {
        isConnected = true;

        // プレイヤーを出現させる
        StartCoroutine("instantiatePlayer");
    }

    private IEnumerator instantiatePlayer()
    {
        // 接続が完了するまで待つ
        while (!Network.isServer && !Network.isClient)
        {
            yield return null;
        }

        // 接続したので出場
        Vector3 pos = new Vector3(Random.Range(-5f, 5f), Random.Range(-2.5f, 2.5f));
        Network.Instantiate(prefPlayer, pos, Quaternion.identity, 0);
    }
  • 上書き保存をして、Unityに切り替えます。
  • [Hierarchy]ビューの[SimpleNet]オブジェクトを選択したら、[Project]ビューの[Player]プレハブをドラッグして、[Inspector]ビューの[Pref Player]欄にドロップします。

以上ができたら、サーバーとクライアントでログインしたときにキャラクターが登場するかを試してみましょう。

  • [File]メニューから[Build & Run]を選択します。
  • ビルドが終わってプログラムが起動したら、[Windowed]にチェックを入れて[Play!]を押します。
  • [ゲームサーバーになる]を押します。プレイヤーが表示されるはずです。
  • 次にUnityを実行します。
  • [上のゲームサーバーに接続]ボタンを押します。

クライアントがゲームサーバーに接続すると、両方の画面にプレイヤーが登場するはずです。これでネットワーク上にキャラクターを登場させることができました。これらのキャラクターは通信するための機能を持ち、お互いにデータをやりとりすることができます。

ただし、まだゲームオブジェクトを登場させただけで、操作をしてみると両方のプレイヤーが同時に動いてしまい、それぞれのプレイヤーがそれぞれのキャラクターを操作できるようにはなっていません。次は、自分のキャラクターを操作できるようにして、それが他のプレイヤーと共有される仕組みを作りましょう。

画面に球が登場しない場合

エラーが発生していないのに画面に球が表示されない場合は、前のページの[Run In Background]の設定ができていないと思われます。macではこの設定がデフォルトでOFFのようなので、前のページで確認して設定してください。

前へ | 次へ