tanaka's Programming Memo

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

Unity5.1 ネットワークシステム Network Clients and Servers

前へ | 次へ

UNet Unity5.1からの新しいネットワークシステム
Unity5.1のネットワークマニュアル斜め読み(2)
UNet NetworkManagerの利用
Unity5.1 ネットワークシステムのオブジェクト生成
Unity5.1 ネットワークシステムの状態同期
Unity5.1 ネットワークシステムのRemote Actions
Unity5.1 ネットワークシステム PlayerObjects
Unity5.1 ネットワークシステム Object Visibility
Unity5.1 ネットワークシステム Network Messages
Unity5.1 ネットワークシステム Matchmaker
Unity5.1 ネットワークシステム Scene Objects
Unity5.1 ネットワークシステム:シングルプレイヤーゲームを多人数に対応させる
Unity5.1 ネットワークシステム Multiplayer Lobby
Unity5.1 ネットワークシステム Network Clients and Servers
Unity5.1 ネットワークリファレンス概要

公式サイトの以下のページの斜め読みメモです。
Unity - マニュアル: Network Clients and Servers

途中に差し込んでいるソースコードは公式サイトからの転載です。

Network Clients and Servers

多人数ゲームで接続を管理するにはNetworkManagerを利用できますが、低レベルなNetworkServerとNetworkClientクラスを直接使って管理することもできます。

HLAPIを使っている時は、ゲームはゲームを提供するサーバーを持つ必要があります。多人数ゲームの参加者全員がクライアントになるには、専用サーバーか、サーバーとクライアントを同時に担当する構成が有り得ます。専用サーバーを立てない多人数ゲームでは、サーバーとクライアントを同時に担当する構成にします。

専用サーバーなしで多人数ゲームを構成するには、プレイヤーのうちの一人がゲームの"Server"も担当します。ゲームの特定のインスタンスは、通常のリモートクライアントではなく、"Local Client"として実行されます。Local Clientはサーバーと同じシーンやオブジェクトを共有して使います。そしてネットワークでメッセージを送らず、内部でメッセージキューを使ってやりとりします。しかし、HLAPIコードとシステムにとってはlocal clientは(サーバーとは)異なるクライアントであり、ローカルであろうがリモートであろうがクライアントのコードはすべてのユーザーで共用できます。これにより、多人数や一人用モードのゲームのコードを同じように書けるので開発が簡単になります。

多人数ゲームのための共通パターンはゲームのネットワーク状態を管理するオブジェクトを持つことです。以下にあげるのはNetworkManagerの開始時のスクリプトです。このスクリプトは、ゲームのシーンのスタートアップ時のゲームオブジェクトに追加されます。簡易なUIを表示して、キーボードの操作でそれぞれのネットワークモードでゲームを開始することができます。実際のゲームに組み込む場合は、"Start Single Player Game"や"Start Multiplayer Game"などのオプションを使ってより見た目が魅力的なメニューにするとよいでしょう。

using UnityEngine;
using UnityEngine.Networking;

public class MyNetworkManager : MonoBehaviour {
    
    public bool isAtStartup = true;
    
    NetworkClient myClient;

    void Update () 
    {
        if (isAtStartup)
        {
            if (Input.GetKeyDown(KeyCode.S))
            {
                SetupServer();
            }
            
            if (Input.GetKeyDown(KeyCode.C))
            {
                SetupClient();
            }
            
            if (Input.GetKeyDown(KeyCode.B))
            {
                SetupServer();
                SetupLocalClient();
            }
        }
    }
    
    void OnGUI()
    {
        if (isAtStartup)
        {
            GUI.Label(new Rect(2, 10, 150, 100), "Press S for server");     
            GUI.Label(new Rect(2, 30, 150, 100), "Press B for both");       
            GUI.Label(new Rect(2, 50, 150, 100), "Press C for client");
        }
    }   
}

このコードの骨組みでは、(モードごとのネットワークを構築する)作業を進めるための設定関数を呼び出しています。以下は、それぞれのモードのための簡単な設定関数の実装です。これらの関数はサーバーを作成するか、シナリオごとに適した種類のクライアントを作成します。この例ではリモートクライアントは同じマシン(127.0.0.1)上で動作することを想定しています。実際のゲームでは、把握しているインターネットアドレスか、マッチメイキングシステムを利用します。

// Create a server and listen on a port
    public void SetupServer()
    {
        NetworkServer.Listen(4444);
        isAtStartup = false;
    }
    
    // Create a client and connect to the server port
    public void SetupClient()
    {
        myClient = new NetworkClient();
        myClient.RegisterHandler(MsgType.Connect, OnConnected);     
        myClient.Connect("127.0.0.1", 4444);
        isAtStartup = false;
    }
    
    // Create a local client and connect to the local server
    public void SetupLocalClient()
    {
        myClient = ClientScene.ConnectLocalServer();
        myClient.RegisterHandler(MsgType.Connect, OnConnected);     
        isAtStartup = false;
    }

このコードのクライアントは、接続した時に発生するイベントであるMsgType.Connectのためのコールバック関数を登録しています。これは、クライアントがサーバーに接続した時に実行されるHLAPIの組み込みメッセージです。今回のケースでは、クライアント上のハンドラー用のコードです。

    // client function
    public void OnConnected(NetworkMessage netMsg)
    {
        Debug.Log("Connected to server");
    }

多人数アプリケーションの起動と実行はこれで十分です。これで、NetworkClient.Send()やNetworkServer.SendToAll()関数を利用してネットワークメッセージを送ることができるようになります。送信されるメッセージはシステムによる低レベルでの通信方法になります。


前へ | 次へ